我有一个静态库(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_lib
与my_shared_lib
相关联,因为它会在相当复杂的可执行文件/共享库组的其他部分产生奇怪的冲突。
答案 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