如何强制静态库中的符号包含在共享库构建中?

BD *_*ill 17 gcc shared-libraries

我正在尝试构建一个共享对象库,该库将由程序使用dlopen()打开.该库将使用由静态的单独库提供的功能.

我在链接行中包含了相应的标志,以便在链接动态库时引入静态库(例如,我有-lfoo for libfoo.a),并且链接器不会抱怨.但是,当主程序在动态库上调用dlopen()时,调用将失败并引用静态库中的符号的"未定义符号"消息.

运行nm确实表明有问题的符号在动态库中未定义,并且主程序不包含它,那么如何强制链接器将此符号拉入?符号本身位于未初始化的数据部分(nm输出中的符号类型"B").

nos*_*nos 18

--whole-archive链接器选项应该这样做.你可以用它作为例如

gcc -o libmyshared.so foo.o -lanothersharedlib -Wl,--whole-archive -lmystaticlib
Run Code Online (Sandbox Code Playgroud)

您所遇到的是,默认情况下,链接器将在您生成的二进制文件所需的静态存档中搜索符号,如果需要,则它将包含符号所在的整个.o.如果您的共享库不需要任何符号,它们不会包含在您的共享库中.

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


小智 12

最近我正在寻找相同的解决方案.我找到了使用

--undefined=symbol
Run Code Online (Sandbox Code Playgroud)

要么

-u symbol
Run Code Online (Sandbox Code Playgroud)

解决了这个问题.


use*_*329 5

另一个技巧是在库初始化期间将函数的地址放在某个地方。这将确保您实际使用该符号。

  • 致下降投票者:我说过“ hack” (4认同)