2011-08-31 20 views
10

我试图建立一个共享对象库,将由程序使用dlopen()打开。该库将使用静态单独库提供的功能。如何强制将静态库中的符号包含在共享库构建中?

我已经包含在链接行上相应的标志链接的动态一个当在静态库拉(例如我有-lfoo为libfoo.a),和接头不抱怨。但是,当主程序在动态库上调用dlopen()时,调用将失败,并引用静态库中的符号的“未定义符号”消息。

运行处确实表明,在讨论的符号的动态库是不确定的,并且主程序不包含它,所以我怎么能强制链接到拉这个符号?符号本身位于未初始化的数据部分(nm输出中的符号类型“B”)。

回答

14

--whole-archive连接选项应该这样做。你会用它作为例如

gcc -o libmyshared.so foo.o -lanothersharedlib -Wl,--whole-archive -lmystaticlib 

什么您遇到的是,在默认情况下,链接器将搜索该二进制你生产需要的静态归档符号,如果它需要一个,它会包括整个的.o的符号驻留在中。如果您的共享库不需要任何符号,它们将不会包含在共享库中。

请记住,成为共享库的代码需要使用特殊选项进行编译,例如-fpic,因为您在共享库中包含静态库,静态库需要使用相同的选项进行编译。

8

最近我正在寻找相同的解决方案。 我发现使用

--undefined=symbol 

-u symbol 

解决了这个问题。

+0

的'--whole-archive'答案会变成存档中的所有符号转换为共享库导出的符号。如果你只需要一个符号,这个答案会在你的.so中创建更少的膨胀。 – MuertoExcobito

4

另一个黑客是利用图书馆的初始化过程中某处函数的地址。这将确保您实际使用符号。

+3

对于下流者:我说,“黑客” – user877329

相关问题