Linux下動態(tài)鏈接庫加載路徑及搜索路徑問題
引子
近日,服務(wù)器遷移后,偷懶未重新編譯nginx的,直接./nginx啟動,結(jié)果遇到如下問題:
“error while loading shared libraries”
這是是因為需要的動態(tài)庫不在動態(tài)鏈接器ld.so的搜索路徑導(dǎo)致。
ld.so 動態(tài)共享庫搜索順序
1、ELF可執(zhí)行文件中動態(tài)段DT_RPATH指定;gcc加入鏈接參數(shù)“-Wl,-rpath”指定動態(tài)庫搜索路徑;
2、環(huán)境變量LD_LIBRARY_PATH指定路徑;
3、/etc/ld.so.cache中緩存的動態(tài)庫路徑??梢酝ㄟ^修改配置文件/etc/ld.so.conf 增刪路徑(修改后需要運行l(wèi)dconfig命令);
4、默認(rèn)的 /lib/;
5、默認(rèn)的 /usr/lib/
與動態(tài)鏈接庫相關(guān)命令
(1)ld 是gcc的鏈接程序。
(2)ldd是查看可執(zhí)行文件中所依賴的庫的程序,比如想查main程序用到了那些動態(tài)庫,可以直接
ldd main
(3)ldconfig用來更新文件/etc/ld.so.conf的修改生效。
(4)nm用來查看.so庫中的函數(shù)名字,標(biāo)記是T的就是動態(tài)庫里面生成的名字。如:nm /lib/libc*.so
Linux 下動態(tài)鏈接庫搜索路徑問題
Linux動態(tài)鏈接庫的搜索路徑按優(yōu)先級排序為:
1.編譯目標(biāo)代碼時指定的動態(tài)庫搜索路徑;
在編譯時通過gcc 的參數(shù)”-Wl,-rpath,”指定。當(dāng)指定多個動態(tài)庫搜索路徑時,路徑之間用冒號”:”分隔。
2.環(huán)境變量LD_LIBRARY_PATH指定的動態(tài)庫搜索路徑;
3.配置文件/etc/ld.so.conf中指定的動態(tài)庫搜索路徑;
/etc/ld.so.conf的第一行有個引用命令:include ld.so.conf.d/*.conf
因此,最優(yōu)雅的方式是在ld.so.conf.d目錄下創(chuàng)建一個你的程序依賴的配置文件,配置文件內(nèi)容為程序依賴的動態(tài)鏈接庫的路徑,一個路徑一行。
添加完配置文件后執(zhí)行l(wèi)dconfig使其生效。
4.默認(rèn)的動態(tài)庫搜索路徑/lib;
5.默認(rèn)的動態(tài)庫搜索路徑/usr/lib;
1、可以用 LD_LIBRARY_PATH 環(huán)境變量指定,這個類似于 PATH 機制,比較直觀,而且,可以放到 bashrc 中固化下來,也可以放到自己的 .bashrc 中只對本用戶起作用;
2、如果啟用了 ld.so.cache 的話,系統(tǒng)會在 /etc/ld.so.cache 中存儲所有可引用的動態(tài)鏈接庫。這個文件的內(nèi)容可以通過 /etc/ld.so.conf 來指定;這個是比較固定的機制,對全局所有用戶都有影響;不過更改設(shè)置后需要 root 調(diào)用 ldconfig 來刷新一下。
3、默認(rèn)的標(biāo)準(zhǔn)庫路徑,這個似乎不用設(shè)置就可以。包括 /lib 和 /usr/lib。當(dāng)然,如果是64位系統(tǒng),還包括 /lib64 和 /usr/lib64。
4、其它情況,如果只想對某一個特定的應(yīng)用程序起作用的話,可以在編譯時指定搜索路徑。gcc 的 -Wl 和 -rpath 參數(shù)。
奇怪的是, /usr/local/lib 和 /usr/local/lib64 居然不在標(biāo)準(zhǔn)路徑之列。
總結(jié)
以上所述是小編給大家介紹的Linux下動態(tài)鏈接庫加載路徑及搜索路徑問題,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對本站網(wǎng)站的支持!
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。
關(guān)注官方微信