轉載連結 http://blog.chinaunix.net/uid-25304914-id-3046279.html
庫 可執行程式的一部分
動態連結相關性 ldd
http://hi.baidu.com/%C4%FE%BE%B2%B5%C4%B7%B1%BB%AA/blog/item/deac821366ba9565cb80c441.html
LD_LIBRARY_PATH:
該 環境變數 主要用於指定尋找共用庫(動態連結程式庫)時除了預設路徑之外的其他路徑。(該路徑在預設路徑之前尋找)
預設路徑是:/usr/lib,和/lib
GNU系統除了設定這個變數外,還可以通過/etc/ld.so.conf 檔案中添加這些路徑,然後執行ldconfig構建字典:/etc/ld.so.cache
。
/etc/ld.so.conf 和LD_LIBRARY_PATH設定的路徑是除了/usr/lib 和 /lib 這兩個可信任路徑外,被信任的庫路徑。
ld.so和ld-linux.so 這個庫負責載入需要使用的動態庫。
ld.so程式處理a.out類二進位程式,這種格式很早之前使用;ld-linux.so*處理ELF這種格式人們一直使用到現在。除此之外兩者一樣,並使用相同的支援檔案和程式,如ldd(1),ldconfig(8)和/etc/ld.so.conf。
尋找程式所需共用庫按以下順序進行:
1、(僅對ELF)如果二進位程式中的DT_RUNPATH屬性不存在,DT_RPATH動態段屬性存在,就使用DT_RPATH中指定的目錄。對DT_RPATH的使用已經被廢棄了。
2、使用環境變數LD_LIBRARY_PATH。除非可執行程式是一個set-user-ID或set-group-ID二進位程式,這種情況下,它被忽略。
3、(僅對ELF)如果二進位程式中的DT_RUNPATH動態段屬性存在,就使用它裡面指定的目錄。
4、從cache檔案/etc/ld.so.cache中尋找,該檔案包含了先前在庫路徑中找到的編譯好的候選庫列表。但當二進位程式被用-z nodeflib連結器選項連結時,預設庫路徑中的庫就會被忽略。
5、在預設路徑/lib中,然後是/usr/lib。如果二進位程式在連結時使用了-z nodeflib連結器選項,這步將被跳過。
http://blog.163.com/jinyu345/blog/static/677789220118910137891/
/etc/ld.so.conf;/etc/ld.so.cache檔案
Linux 系統上有兩類不同的Linux 可執行程式。
第一類是 靜態連結的 可執行程式。靜態可執行程式包含執行所需的所有函數 — 換句話說,它們是“完整的”。因為這一原因,靜態可執行程式不依賴任何外部庫就可以運行。
第二類是 動態連結的可執行程式。
靜態可執行程式與動態可執行程式比較
我們可以用 ldd 命令來確定某一特定可執行程式是否為靜態連結的:
# ldd /sbin/sln
not a dynamic executable
"not a dynamic executable”是 ldd 說明 sln 是靜態連結的一種方式。現在,讓我們比較 sln 與其非靜態同類 ln 的大小:
# ls -l /bin/ln /sbin/sln
-rwxr-xr-x 1 root root 23000 Jan 14 00:36 /bin/ln
-rwxr-xr-x 1 root root 381072 Jan 14 00:31 /sbin/sln
如您所見,sln 的大小超過 ln 十倍。ln 比 sln 小這麼多是因為它是動態可執行程式。動態可執行程式是不完整的程式,它依靠外部共用庫來提供運行所需的許多函數。
動態連結相關性
要查看 ln 依賴的所有共用庫的列表,可以使用 ldd 命令:
# ldd /bin/ln
libc.so.6 => /lib/libc.so.6 (0x40021000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
如您所見,ln 依賴外部共用庫 libc.so.6 和 ld-linux.so.2。通常,動態連結的程式比其靜態連結的等價程式小得多。不過,靜態連結的程式可以在某些低級維護任務中發揮作用。例如,sln 是修改位於 /lib 中的不同庫符號連結的極佳工具。但通常您會發現幾乎所有 Linux 系統上的可執行程式都是某種動態連結的變體。
動態裝入器
那麼,如果動態可執行程式不包含運行所需的所有函數,Linux 的哪部分負責將這些程式和所有必需的共用庫一起裝入,以使它們能正確執行呢?答案是動態裝入器(dynamic loader),它實際上是您在 ln 的 ldd 清單中看到的作為共用庫相關性列出的 ld-linux.so.2 庫。動態裝入器負責裝入動態連結的可執行程式運行所需的共用庫。現在,讓我們迅速查看一下動態裝入器如何在系統上找到適當的共用庫。
ld.so.conf
動態裝入器找到共用庫要依靠兩個檔案 — /etc/ld.so.conf 和 /etc/ld.so.cache。如果您對 /etc/ld.so.conf 檔案進行 cat 操作,您可能會看到一個與下面類似的清單:
$ cat /etc/ld.so.conf
/usr/X11R6/lib
/usr/lib/gcc-lib/i686-pc-linux-gnu/2.95.3
/usr/lib/mozilla
/usr/lib/qt-x11-2.3.1/lib
/usr/local/lib
ld.so.conf 檔案包含一個所有目錄(/lib 和 /usr/lib 除外,它們會自動包含在其中)的清單,動態裝入器將在其中尋找共用庫。
ld.so.cache
但是在動態裝入器能“看到”這一資訊之前,必須將它轉換到 ld.so.cache 檔案中。可以通過運行 ldconfig 命令做到這一點:
# ldconfig
當 ldconfig 操作結束時,您會有一個最新的 /etc/ld.so.cache 檔案,它反映您對 /etc/ld.so.conf 所做的更改。從這一刻起,動態裝入器在尋找共用庫時會查看您在 /etc/ld.so.conf 中指定的所有新目錄。
ldconfig 技巧
要查看 ldconfig 可以“看到”的所有共用庫,請輸入:
# ldconfig -p | less
還有另一個方便的技巧可以用來配置共用庫路徑。有時候您希望告訴動態裝入器在嘗試任何 /etc/ld.so.conf 路徑以前先嘗試使用特定目錄中的共用庫。在您啟動並執行較舊的應用程式不能與當前安裝的庫版本一起工作的情況下,這會比較方便。
LD_LIBRARY_PATH
要指示動態裝入器首先檢查某個目錄,請將 LD_LIBRARY_PATH 變數設定成您希望搜尋的目錄。多個路徑之間用冒號分隔;例如:
# export LD_LIBRARY_PATH="/usr/lib/old:/opt/lib"
匯出 LD_LIBRARY_PATH 後,如有可能,所有從當前 shell 啟動的可執行程式都將使用 /usr/lib/old 或 /opt/lib 中的庫,如果仍不能滿足一些共用庫相關性要求,則轉回到 /etc/ld.so.conf 中指定的庫。