Libraries

是否有動態連結庫的 rpath?

  • April 11, 2020

因此,我正在處理的項目使用非系統目錄來保存程式碼使用的一些 DLL。我不想將它們放在系統目錄中,因此執行檔設置了一個 rpath 來查找 DLL。但是,隨著越來越多的庫被添加,現在有依賴於該目錄中其他 DLL 的 DLL。

這些庫找不到它們所依賴的 DLL,因為它們不在連結器正在尋找的目錄中,例如係統目錄。

有沒有辦法讓 DLL 搜尋這個特定的非系統目錄?比如rpath?圖書館是如何做到的?用於該項目的建構系統是 CMake,如果這有助於答案。

這個答案不起作用,因為庫中沒有 rPath 標籤:https ://unix.stackexchange.com/a/272286/4193

我考慮過使用LD_LIBRARY_PATH, 並且可行,但是打字很煩人,而且讓其他人使用該應用程序並不是那麼好。如果有辦法將rPath標籤添加到庫中,那將是最好的選擇。

指向以前相關問題和答案的指針表示讚賞。

是否有動態連結庫的 rpath?

就在這裡。您可以-Wl,-rpath像使用 ELF 執行檔一樣使用 ELF 共享對象。複製我在 這裡提出的一個小例子:

git clone https://gist.github.com/ardrabczyk/6aeb8545c9b754d6b15be390af4bdff0

執行make編譯。檢查main ELF 執行檔需要哪些庫:

$ readelf -d ./main

Dynamic section at offset 0xe30 contains 22 entries:
 Tag        Type                         Name/Value
0x0000000000000001 (NEEDED)             Shared library: [libtwo.so]
0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
0x000000000000000f (RPATH)              Library rpath: [.]
(...)

並檢查需要哪些庫libtwo.so

$ readelf -d ./libtwo.so

Dynamic section at offset 0xe38 contains 22 entries:
 Tag        Type                         Name/Value
0x0000000000000001 (NEEDED)             Shared library: [libone.so]
0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
0x000000000000000f (RPATH)              Library rpath: [libs]
(...)

如您所見,兩者都main需要libtwo.so一些共享對象,並且都設置了 rpath。您無需設置 LD_LIBRARY_PATH 即可執行 ./main:

$ ./main
I'm in bar()

main 將始終在.目前目錄中查找其 libtwo.so 依賴項,而 libtwo.so 反過來將始終在libs目錄中查找其 libone.so 依賴項。如果libs缺少 ./main 將無法啟動:

$ mv libs libs.bak
$ ./main
./main: error while loading shared libraries: libone.so: cannot open shared object file: No such file or directory

恢復它:

$ mv libs.bak libs
$ ./main
I'm in bar()

引用自:https://unix.stackexchange.com/questions/571861