我有一个可执行文件E,它(我假设)动态加载(dlopen)一个库文件A.so。文件A.so动态链接由我产生的B.so。在B.so中,我静态地链接了许多库,例如Boost (让我们称之为静态boost库C1)。只有B完全在我的控制之下。A仅部分(例如,我可以添加一些链接器标志)。
看起来E也在动态地连接一个较旧版本的Boost。让我们把这个Boost库称为C2。当我运行E并使用B中的代码时,它会解析来自C2的Boost符号(更具体地说,涉及序列化库),这会导致崩溃,因为这些代码与B中静态链接C1的代码不兼容。
如何确保B总是使用静态链接Boost库中的符号,而不是任何动态链接库中的符号?或者更一般地说,我实际上希望确保所有静态链接到B的库都能这样做。
更多信息:
ldd检查了B的依赖项,它们不引用Boost库。nm -D检查)。我不能更改C2,我也不知道如何隐藏B中弱的Boost符号。--retain-symbols-file选项ld来控制要从B导出哪些符号。--version-script或--dynamic-list,而不是使用--retain-symbols-file选项。-Bsymbolic和--whole-archive,但没有解决这个问题。visibility attribute,因为我希望能够使用不同的导出配置链接相同的代码。发布于 2015-07-17 21:16:23
您提到B不动态链接任何boost库。因此,这个问题不太可能涉及到助推符号。
你对从B输出的弱符号的担忧似乎被逆转了。如果B的输出会发生冲突,则必须替换C2的符号(但是在A -> B -> C1之前逻辑上加载了这些符号)。我不认为这是罪魁祸首。
其他库是 gettig动态链接
具体来说,我怀疑C/C++运行库之间的ABI不兼容。您可能希望了解主机应用程序使用了哪些编译器版本/选项。
另外,(E->A) C还是C++之间的接口?
(A->B) C或C++之间是接口吗?
https://stackoverflow.com/questions/31471632
复制相似问题