2011-05-19 72 views
3

爲什麼-rdynamic不能在.a文件中導出符號,而是在.o文件中導出符號?GCC -rdynamic不能用靜態庫

我在.so文件中有一個應用程序和一個插件。主應用程序是使用一系列目標文件和一個靜態庫的鏈接,這樣的:

CXXFLAGS =  $(CXXFLAGS_COMMON) -rdynamic 
STATICLIBS = ../Utilities/Utilities.a 
... 

all: 
    $(CXX) $(CXXFLAGS) -o $(SAMPLE) main.o $(STATICLIBS) $(SHAREDLIBS) $(INCLUDES) 

(CXX爲g ++ 4.5.2上Ubunut,我使用主要-std = C++牛進行編譯)

在這種情況下,Utilities.a中的符號不​​會被導出(即「objdump -t a.out | grep symbol」爲空)。

如果我使用「ar x」僅使用.o's提取.a和鏈接中的.o文件,則插件將導出並找到這些符號(如果使用了dlopen想知道)。

我試過使用-Wl,-export-dynamic但沒有成功。

我的確有一個解決方法,正如所提到的,但我仍然希望瞭解我缺少的東西。提前致謝 !

回答

8

通常,鏈接器只包含被引用的那些靜態檔案文件(.a文件)。

要強制鏈接器包含.a文件的全部內容,可以使用--whole-archive鏈接器選項(因此在gcc命令行上使用-Wl,--whole-archive)。

請注意,-Wl,--whole-archive在命令行上對位置敏感 - 它只在命令行上影響其後的.a文件。如果您還不想完全包含更多靜態存檔文件,則可以使用-Wl,--no-whole-archive關閉其效果。

所以,舉例來說,你的命令:

$(CXX) $(CXXFLAGS) -o $(SAMPLE) main.o -Wl,--whole-archive $(STATICLIBS) -Wl,--no-whole-archive $(SHAREDLIBS) $(INCLUDES) 
+1

非常感謝,我會試一試! – 2011-10-03 02:24:32

+1

確實很有用,謝謝! – 2011-10-04 00:11:17

1

A .o文件是ELF可重新定位的,並且,.so文件是ELF共享對象。而.a文件是當前存檔。當鏈接器通過--export-dynamic標誌通過-rdynamicgcc,它正在尋找一個動態的目標文件。

我認爲鏈接器不關心查看歸檔並提取符號。

+0

感謝您的時間!現在,該錯誤報告頁在哪裏? – 2011-05-20 09:53:00