如何确保在动态库文件

时间:2015-07-17 08:40:57

标签: c++ boost shared-libraries static-libraries ld

我有一个可执行的E(我假设)动态加载(dlopen)库文件A.so.文件A.so动态链接由我生成的B.so.在B.so中我静态链接了许多库,例如Boost(让我们称之为静态升压库C1)。只有B完全在我的控制之下。只是部分(我可以添加一些链接器标志)。

似乎E还动态链接旧版本的Boost。我们称之为Boost库C2。当我运行E并且使用来自B的代码时,它解析了来自C2的Boost符号(更具体地说是关于序列化库),这会导致崩溃,因为这些与B中静态链接C1的代码不兼容。

如何确保B始终使用静态链接Boost库中的符号,而不是任何动态链接库中的符号?或者更一般,我实际上想要确保我静态链接到B的所有库。

更多信息:

  • 我用ldd检查了B的依赖关系,但它们没有引用Boost库。
  • 我认为问题可能是由于C2导出序列化符号而B导出弱符号(使用nm -D检查)。我无法改变C2,我不知道如何隐藏B中的弱Boost符号。
  • 我使用--retain-symbols-file的{​​{1}}选项来控制我要从B导出的符号。
  • 我还尝试使用ld--version-script,而不是使用--dynamic-list选项。
  • 在将静态库链接到B时,我尝试将--retain-symbols-file-Bsymbolic一起使用,但它没有解决问题。
  • 我不想在我的代码中使用--whole-archive,因为我希望能够使用不同的导出配置链接相同的代码。

1 个答案:

答案 0 :(得分:0)

您提到B不会动态链接任何提升库。因此,问题不太可能涉及增强符号。

您对从B导出的弱符号的担忧似乎已被逆转。如果B的输出会发生冲突,那么就必须替换 C2的符号(但是在A - > B - > C1之前逻辑加载)。我不认为这些是罪魁祸首。

其他哪些 动态链接的动态链接

具体来说,我怀疑C / C ++运行时库之间的ABI不兼容。您可能想要找出主机应用程序使用的编译器版本/选项。

此外,(E-> A)C或C ++之间的接口是什么?

(A-> B)C或C ++之间的接口是什么?