我有一个可执行的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库。nm -D
检查)。我无法改变C2,我不知道如何隐藏B中的弱Boost符号。--retain-symbols-file
的{{1}}选项来控制我要从B导出的符号。ld
或--version-script
,而不是使用--dynamic-list
选项。--retain-symbols-file
与-Bsymbolic
一起使用,但它没有解决问题。--whole-archive
,因为我希望能够使用不同的导出配置链接相同的代码。答案 0 :(得分:0)
您提到B不会动态链接任何提升库。因此,问题不太可能涉及增强符号。
您对从B导出的弱符号的担忧似乎已被逆转。如果B的输出会发生冲突,那么就必须替换 C2的符号(但是在A - > B - > C1之前逻辑加载)。我不认为这些是罪魁祸首。
其他哪些 动态链接的动态链接?
具体来说,我怀疑C / C ++运行时库之间的ABI不兼容。您可能想要找出主机应用程序使用的编译器版本/选项。
此外,(E-> A)C或C ++之间的接口是什么?
(A-> B)C或C ++之间的接口是什么?