2012-12-13 46 views
1

我有一個靜態庫(my_static_lib),我鏈接到一個可執行的二進制文件。一些符號,但不是全部,在我的二進制文件中使用。如何在二進制文件中保留特定符號?

動態加載的第二個庫(my_shared_lib)期望通過從二進制文件中注入符號從my_static_lib接收一些符號。但是這些符號不被my_binary使用,所以它們被剝離了最終的bin文件。

因此,在運行時,my_shared_lib抱怨說它無法找到__my_stripped_symbols__和崩潰。

有沒有辦法強制鏈接器保持__my_stripped_symbols__?我喜歡的東西,可以清晰地寫在Makefile.am(自動工具)

(-binary file makefile) 
-L$(top_builddir)/static_lib -lmy_static_lib --magic-flag-to-keep-stripped-symbol 

我不想my_shared_lib鏈接my_static_lib,因爲它會生成可執行文件中的一個相當複雜的組的其他部位奇怪的衝突/共享庫。

回答

4

當您將my_static_lib鏈接到您的應用程序時,您想要使用--whole-archive選項。它記錄在ld options docs中。

如果你用gcc鏈接時,它看起來是這樣的:

-L$(top_builddir)/static_lib -Wl,-whole-archive -lmy_static_lib -Wl,-no-whole-archive 

,將確保整個庫保持,而不僅僅是你的可執行文件使用的特定功能。

您還需要確保符號被導出。如果靜態庫中的符號未被導出,則需要組合-fvisibility=hidden並使用__attribute__ ((visibility("default")))來標記要導出的符號。你可以在gcc docs

相關問題