Gcc
如何建構我的共享庫 (.so) 以便包含來自不同共享庫的符號?
我的共享庫
libnew.so
使用了一些符號,形成了一個已經建構的第三方共享庫libold.so
。我想建構一個可執行的二進製文件,該文件應該只連結到libnew.so
. 但它仍然需要與它聯繫起來libold.so
。否則,連結器會抱怨undefined reference to symbol...
.我使用這些命令來建構
libnew.so
和執行檔。出於某種原因,它只允許使用目前目錄,我不能把我的文件放在其他地方。順便說一句,將
nm libnew.so
符號顯示libold.so
為未定義。ldd libnew.so
也沒有報告任何libold.so
。如果我不libold.so
用於建築libnew.so
,尺寸libnew.so
不會改變!對於 libnew.so :
gcc -Wall -fPIC -c libnew.c gcc -shared -Wl,-soname,libnew.so.1 -o libnew.so.1.0 *.o -L. -lold ln -sf libnew.so.1.0 libnew.so.1 ln -sf libnew.so.1.0 libnew.so
對於執行檔:
#this does not work and needs -lold as well. gcc -Wall main.c -L. -lnew -o prog
有什麼遺漏嗎?謝謝!
缺少的是您的連結器命令
gcc -shared -Wl,-soname,libnew.so.1 -o libnew.so.1.0 *.o -L. -lold
不會從複製對象
libold.so
,而是引用該文件中的符號來告訴動態載入器它可以從哪裡獲取這些符號。通常,當有人試圖抑制/隱藏給定庫時,他們首先重新組合用於製作共享庫的目標文件。您可能可以通過部分連結來完成此操作,但我沒有看到解決方案(因為共享庫和共享對像不可互換)。
進一步閱讀:
- 合併多個 .so 共享庫(說它不起作用……)
- 什麼是 GNU 連結器中的部分連結?
ld
- GNU 連結器