我有一個使用一些共享物件的可執行檔案。
這些共享物件具有其他共享物件作為依賴項,我想設定我的主要可執行檔案rpath以包含這些依賴項的目錄,因為runpath不用于間接依賴項。
我正在嘗試烘焙rpath到我的 ELF 中,但是當使用這個時:
gcc -std=c 20 -o main main.cpp -lstdc -L./lib -Wl,-rpath,./lib
結果是./lib在 ELF 中設定為RUNPATH而不是RPATH:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [libstdc .so.6]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
0x000000000000001d (RUNPATH) Library runpath: [./lib]
0x000000000000000c (INIT) 0x1000
...
有人可以解釋為什么會這樣嗎?我期望./lib在該RPATH部分中定義而不是RUNPATH. 似乎RPATH部分根本不存在。
我正在使用gcc版本11.1.0,帶有ld版本2.34。
我知道這可能不是管理間接依賴關系的最佳解決方案,我很高興聽到更好的解決方案,但是我仍然想知道為什么-Wl,-rpath,./lib結果在RUNPATHELF 中定義,而不是RPATH.
uj5u.com熱心網友回復:
要獲得 DT_RUNPATH 條目,您需要--enable-new-dtags.
要獲得 DT_RPATH 條目(已棄用),您需要--disable-new-dtags.
在你的情況下,是這樣的:
gcc -std=c 20 -o main main.cpp -lstdc -L./lib -Wl,--disable-new-dtags,-rpath,./lib
我建議使用帶有 rpath 的絕對路徑,我不確定從哪個目錄解釋相對路徑。$ORIGIN如果您想使用可執行檔案作為參考點,也可以使用。
有關更多資訊,請參閱https://man7.org/linux/man-pages/man1/ld.1.html和https://man7.org/linux/man-pages/man8/ld.so.8.html。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/525551.html
