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_static_libmy_shared_lib因为它会在一组相当复杂的可执行文件/共享库的其他部分产生奇怪的冲突。

4

1 回答 1

4

当您链接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 文档中了解更多信息

于 2012-12-13T08:48:56.953 回答