Gcc

如何建構我的共享庫 (.so) 以便包含來自不同共享庫的符號?

  • November 22, 2018

我的共享庫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,而是引用該文件中的符號來告訴動態載入器它可以從哪裡獲取這些符號。

通常,當有人試圖抑制/隱藏給定庫時,他們首先重新組合用於製作共享庫的目標文件。您可能可以通過部分連結來完成此操作,但我沒有看到解決方案(因為共享庫和共享對像不可互換)。

進一步閱讀:

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