<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>
"); //-->

博客專(zhuān)欄

EEPW首頁(yè) > 博客 > 動(dòng)態(tài)庫的鏈接和鏈接選項-L,-rpath-link,-rpath

動(dòng)態(tài)庫的鏈接和鏈接選項-L,-rpath-link,-rpath

發(fā)布人:電子禪石 時(shí)間:2023-01-13 來(lái)源:工程師 發(fā)布文章
鏈接動(dòng)態(tài)庫

如何程序在連接時(shí)使用了共享庫,就必須在運行的時(shí)候能夠找到共享庫的位置。linux的可執行程序在執行的時(shí)候默認是先搜索/lib和/usr/lib這兩個(gè)目錄,然后按照/etc/ld.so.conf里面的配置搜索絕對路徑。同時(shí),Linux也提供了環(huán)境變量LD_LIBRARY_PATH供用戶(hù)選擇使用,用戶(hù)可以通過(guò)設定它來(lái)查找除默認路徑之外的其他路徑,如查找/work/lib路徑,你可以在/etc/rc.d/rc.local或其他系統啟動(dòng)后即可執行到的腳本添加如下語(yǔ)句:LD_LIBRARY_PATH =/work/lib:$(LD_LIBRARY_PATH)。并且LD_LIBRARY_PATH路徑優(yōu)先于系統默認路徑之前查找(詳細參考《使用LD_LIBRARY_PATH》)。

不過(guò)LD_LIBRARY_PATH的設定作用是全局的,過(guò)多的使用可能會(huì )影響到其他應用程序的運行,所以多用在調試。(LD_LIBRARY_PATH的缺陷和使用準則,可以參考《Why LD_LIBRARY_PATH is bad》 )。通常情況下推薦還是使用gcc的-R或-rpath選項來(lái)在編譯時(shí)就指定庫的查找路徑,并且該庫的路徑信息保存在可執行文件中,運行時(shí)它會(huì )直接到該路徑查找庫,避免了使用LD_LIBRARY_PATH環(huán)境變量查找。

鏈接選項和路徑

現代連接器在處理動(dòng)態(tài)庫時(shí)將鏈接時(shí)路徑(Link-time path)和運行時(shí)路徑(Run-time path)分開(kāi),用戶(hù)可以通過(guò)-L指定連接時(shí)庫的路徑,通過(guò)-R(或-rpath)指定程序運行時(shí)庫的路徑,大大提高了庫應用的靈活性。比如我們做嵌入式移植時(shí)#arm-linux-gcc $(CFLAGS) –o target –L/work/lib/zlib/ -llibz-1.2.3 (work/lib/zlib下是交叉編譯好的zlib庫),將target編譯好后我們只要把zlib庫拷貝到開(kāi)發(fā)板的系統默認路徑下即可?;蛘咄ㄟ^(guò)-rpath(或-R )、LD_LIBRARY_PATH指定查找路徑。

鏈接器ld的選項有 -L,-rpath 和 -rpath-link,看了下 man ld,大致是這個(gè)意思:

-L: “鏈接”的時(shí)候,去找的目錄,也就是所有的 -lFOO 選項里的庫,都會(huì )先從 -L 指定的目錄去找,然后是默認的地方。編譯時(shí)的-L選項并不影響環(huán)境變量LD_LIBRARY_PATH,-L只是指定了程序編譯連接時(shí)庫的路徑,并不影響程序執行時(shí)庫的路徑,系統還是會(huì )到默認路徑下查找該程序所需要的庫,如果找不到,還是會(huì )報錯,類(lèi)似cannot open shared object file。

-rpath-link:這個(gè)也是用于“鏈接”的時(shí)候的,例如你顯示指定的需要 FOO.so,但是 FOO.so 本身是需要 BAR.so 的,后者你并沒(méi)有指定,而是 FOO.so 引用到它,這個(gè)時(shí)候,會(huì )先從 -rpath-link 給的路徑里找。

-rpath: “運行”的時(shí)候,去找的目錄。運行的時(shí)候,要找 .so 文件,會(huì )從這個(gè)選項里指定的地方去找。對于交叉編譯,交叉編譯鏈接器需已經(jīng)配置 –with-sysroot 選項才能起作用。也就是說(shuō),-rpath指定的路徑會(huì )被記錄在生成的可執行程序中,用于運行時(shí)查找需要加載的動(dòng)態(tài)庫。-rpath-link 則只用于鏈接時(shí)查找。


鏈接搜索順序

直接man ld。The linker uses the following search paths to locate required shared libraries:




gcc和鏈接選項的使用

在gcc中使用ld鏈接選項時(shí),需要在選項前面加上前綴-Wl(是字母l,不是1),以區別不是編譯器的選項。

if the linker is being invoked indirectly, via a compiler driver (e.g. gcc) then all the linker command line options should be prefixed by -Wl, (or whatever is appropriate for the particular compiler driver) like this:

gcc  main.c  -lhello -L . -Wl.-rpath=./lib

This is important, because otherwise the compiler driver program may silently drop the linker options, resulting in a bad link.



*博客內容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀(guān)點(diǎn),如有侵權請聯(lián)系工作人員刪除。



關(guān)鍵詞: gcc

相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>