2016-04-01 80 views
2

我遇到以下問題。我有一個共享庫,這只是一堆鏈接在一起的翻譯單元,所以當我編譯共享庫時,我不會得到任何鏈接器錯誤(即使我可能有未定義的引用)。GCC將共享庫鏈接到可執行文件

共享庫從一個可執行文件中動態加載,該文件也包含我的共享庫正在使用的導出(我的庫中使用的引用在運行時解析)。

主要問題是我想要未定義的引用警告,以便我可以靜態修復它們而不是等待應用程序崩潰。

我在某處讀到我可以將「-Wl, - no-undefined」傳遞給gcc,這樣我就可以得到這些錯誤,確實有效,但它也給了我可執行文件導出的所有未定義引用。我想過濾這些警告只是我的翻譯單位的範圍。

這可能嗎?如果沒有,我怎樣才能定義對一個共享庫導出的可執行文件的引用。

+1

通常,未解決的引用會導致鏈接失敗。這不完全清楚你在做什麼。請在你的問題中加入[mcve]。 –

回答

1

你可以嘗試鏈接庫&主程序與-Wl,-z,now。這應該會使運行時立即解析所有引用,並且如果沒有找到則拋出錯誤。

否則,我沒有在鏈接器手冊中看到一個選項,用於說「允許此ELF滿足符號,但實際上不會將其列爲DT_NEEDED」。

您可以嘗試使用-Wl,--no-undefined並使用腳本解析輸出,以便過濾掉您知道主程序將滿足的符號。

另一個選項可能是標記主程序提供的所有符號與__attribute__((weak))然後仍然使用-Wl,--no-undefined。弱符號不會被報告爲錯誤。

相關問題