LD_PRELOAD & LD_LIBRARY_PATH 動態庫路徑


參考:http://www.cnblogs.com/waterlin/archive/2011/07/14/2106056.html

143上的glibc較低,同學又不能進行升級(造成全局影響),所以使用了LD_LIBRARY_PATH,將179上的/lib,然后在.bashrc中添加

export LD_LIBRARY_PATH=path/lib:path/lib/x86_64-linxu-gnu

 

參考自:

http://blog.csdn.net/haoel/article/details/1602108

http://skatings.blogbus.com/logs/50437681.html

LD_PRELOAD 是這樣的一個環境變量:它可以影響程序的運行時的鏈接(Runtime linker),它允許你定義在程序運行前優先加載的動態鏈接庫。該功能主要就是用來有選擇性的載入不同動態鏈接庫中的相同函數。通過這個環境變量,我們 可以在主程序和其動態鏈接庫的中間加載別的動態鏈接庫,甚至覆蓋正常的函數庫。

 

在Linux下面,共享庫的尋找和加載是由 /lib/ld.so實現的。ld.so在標准路徑(/lib, /usr/lib) 中尋找應用程序的共享庫。

那么:

如果需要用到的共享庫在非標准路徑,ld.so怎么找到這些庫呢?

方法一:

鏈接時候通過 -R選項(或 -rpath)指定 run-time path.

 

方法二:

使用LD_LIBRARY_PATH來處理非標准路徑的共享庫。ld.so加載共享庫的時候,也會查找這個變量鎖設置的路徑。

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:path
export LD_LIBRARY_PATH

 

方法三:

(1)將非標准庫路徑加入  /etc/ld.so.conf;/etc/ld.so.conf文件內存放着可被Linux共享的動態鏈接庫所在目錄的名字(系統目錄/lib, /usr/lib除外)

(2)運行ldconfig跟新 /etc/ld.so.cache;ld.so加載共享庫的時候,會從ld.so.cache查找。

 

方法四:

(1)將所生成的動態庫,放入  /lib 或  /usr/lib  目錄下;

(2)調用ldconfig   否則找不到library  (ldconfig 跟新 ld.so.cache).

 

動態庫的搜索路徑搜索的先后順序是:
    編譯目標代碼時指定的動態庫搜索路徑
    環境變量LD_LIBRARY_PATH指定的動態庫搜索路徑
    配置文件/etc/ld.so.conf中指定的動態庫搜索路徑
    默認的動態庫搜索路徑/lib
    默認的動態庫搜索路徑/usr/lib

 

附:

參考自:http://www.ituring.com.cn/article/22101

LD_LIBRARY_PATH是一個環境變量,它的作用是為ld.so在運行時提供一個額外的搜索路徑列表。

出於安全原因,對於已設置setuid或setgid的可執行文件,LD_LIBRARY_PATH被完全忽略。

LD_LIBARY_PATH的需求有很多:

1、兼容性測試
2、將動態庫放置它處,做臨時測試

LD_LIBRARY_PATH不僅影響程序的加載,而且在鏈接階段也會被搜索,順序位於-L所指定的目錄之后(沒有-L選項也會被搜索).

好的使用LD_LIBRARY_PATH的例子應該是:

1、升級共享庫時,替換之前先測試一下
2、類似的,升級后的某個程序可能依賴於一些動態鏈接庫,如果你將某個鏈接庫替換了,程序可能就無法工作了。這時候,你可以使用LD_LIBRARY_PATH指向存有備份的一個目錄,然后,你可以沒有顧忌地替換系統版本了。萬一出錯,拷貝回去就是了。

 

規范的LD_LIBRARY_PATH使用方法:

1、絕不要設置全局的LD_LIBRARY_PATH
2、如果你一定要發布(ship)一個依賴於標准庫的程序,而且要把它安裝到非標准位置,按下面方法之一實施:
    (1)發布二進制.o文件,在安裝過程中使用正確的已安裝的庫來重新鏈接。
    (2)發布可執行文件時,嵌入一個很長的虛假運行時庫路徑,在安裝過程中,使用二進制編輯器將其替換為正確的庫路徑。
    (3)如果你必須使用LD_LIBRARY_PATH,將其封裝起來(如在局部的腳本中使用),而不至於影響其它程序。

 

附:

參考:http://www.cnblogs.com/openix/admin/EditPosts.aspx?postid=2431791

ldconfig是動態鏈接庫的管理命令。該命令主要是在默認搜尋目錄(/lib和/usr/lib)以及動態庫配置文件/etc/ld.so.conf內所列的目錄下,搜索出可共享的動態鏈接庫,進而創建/跟新ld.so所需的鏈接和緩存文件。緩存文件默認為/etc/ld.so.cache,此文件保存已排好序的動態鏈接庫名字列表。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM