如何在二进制文件中保留特定符号?

时间:2012-12-13 08:35:42

标签: linux gcc gnu ld autotools

我有一个静态库(my_static_lib),它链接到可执行二进制文件。我的二进制文件中使用了一些符号,但不是全部符号。

动态加载的第二个库(my_shared_lib)期望通过二进制符号注入从my_static_lib接收一些符号。但my_binary不使用这些符号,因此它们会从最终的bin文件中删除。

因此,在运行时,my_shared_lib会抱怨找不到__my_stripped_symbols__并崩溃。

有没有办法强制链接器保留__my_stripped_symbols__?我更喜欢可以在Makefile.am(autotools)中清晰编写的东西

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

我不想将my_static_libmy_shared_lib相关联,因为它会在相当复杂的可执行文件/共享库组的其他部分产生奇怪的冲突。

1 个答案:

答案 0 :(得分: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

中阅读更多相关信息