如何在二进制文件中保留特定的符号?
我有一个静态库( 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
链接my_static_lib
,因为它会在一组相当复杂的可执行文件/共享库的其他部分中产生奇怪的冲突。
将my_static_lib
链接到应用程序时,您需要使用--whole-archive
选项。 它在ld选项文档中有记录。
如果你使用gcc链接,它看起来像这样:
-L$(top_builddir)/static_lib -Wl,-whole-archive -lmy_static_lib -Wl,-no-whole-archive
这将确保整个库保留,而不仅仅是您的可执行文件使用的特定功能。
您还需要确保符号被导出。 如果你的静态库中的符号没有被导出,你需要结合-fvisibility=hidden
并使用__attribute__ ((visibility("default")))
来标记你想要导出的符号。 您可以在gcc文档中阅读更多关于它的信息