2011-11-17 20 views
0

我試圖使用--whole-archive選項,但它似乎不適用於-Xlinker。我如何使用 - Xlinker來添加此選項?如何從靜態庫中添加特定符號

下面是整個故事: 我寫了一個主程序A和幾個共享庫B1,B2等。主程序將使用dlopen在運行時加載這些共享庫。我編譯主程序A與主程序(S1,S2 ...等)或共享庫(S3,S4 ...等)使用的所有可能的靜態庫鏈接。然後我編譯沒有靜態庫的共享庫。 當調用dlopen時,由於共享庫中的未定義符號,程序失敗。這個符號確實存在於靜態庫S3中,但我在主程序的符號表中找不到它。

因此,我在編譯主程序時添加--whole-archive選項,但該符號仍然不存在於最終的二進制文件中。如何將這個符號添加到主程序中,而不是直接在主程序中使用。

+0

假設你使用的是GNU binutils,''-whole-archive'與'-Xlinker'完美兼容。你可能想澄清一下你的問題:你使用的是什麼命令行,是什麼讓你相信' - 整個檔案文件'不起作用,等等。 –

+0

謝謝我已經使整個故事更加清晰 – Shawn

回答

1

所以我編譯主程序時添加--whole存檔選項

你還沒有回答的問題是:你使用什麼命令行。當編譯時添加鏈接器選項一般毫無意義:它們只在鏈接時纔有意義。

爲你描述(假設你是一個UNIX/ELF系統上使用GCC)形勢的正確鏈接線:

gcc -rdynamic -o exename main.c \ 
    -Wl,--whole-archive -lS1 -lS2 -Wl,--no-whole-archive 

的要點說明:

  1. -rdynamic需要因此在主要的 可執行文件中定義的符號對於共享庫是可見的。
  2. 圖書館應遵循鏈接線上的來源(圖書館和來源的順序matters)。
  3. 要完全鏈接的庫應包含--whole-archive--no-whole-archive選項。
+0

其實我正在使用工具來生成Makefile,我無法控制--whole-archive,-l *,--no-whole-archive的順序。因此,正如你所指出的那樣,這是因爲我想完全鏈接的靜態庫不是跟隨 - 整個歸檔選項。謝謝,這是非常有幫助的 – Shawn

相關問題