7

我有共享对象 A.so ,它静态链接到 libssl.a 和另一个共享对象 B.so ,它也静态链接 libssl.a 。

A.so & B.so 在全球范围内具有来自 libssl.a 的符号。我通过 readelf -s A.so 检查了这个

我有一个可执行的 a.out 加载 A.so 和 B.so。当 a.out 终止时,我在 A.so 中的 libssl.a 中的一个符号中出现双重释放错误。

尽管 libssl.a 静态链接到每个共享对象,但由于它们是全局公开的,因此有可能共享相同的符号而不是选择它的本地副本。

这是什么解决方法?如何在这里使符号本地化?

请帮忙

4

1 回答 1

5

这确实是意料之中的。一个实例libssl.a插入另一个实例(可能是另一个实例的子集),结果并不漂亮。您可以使用版本脚本(--version-scriptto ld,with for cc)来控制从and-Wl,导出的内容。如果某些东西没有被导出,它也不能被插入。A.soB.so

libssl.a或者,您可以使用可见性标志进行编译,例如-fvisibility=hidden. 这些标志只影响动态链接器而不影响静态链接。无论如何,您可能需要自己编译它,因为交付的.a文件往往包含与位置相关的代码,用于链接到可执行文件。只有某些平台(例如 32 位 x86)允许您将此类代码链接到共享对象中,并且仅以文本重定位为代价。

评论中建议的dlopenwith也应该有效,但用于此目的RTLD_LOCAL似乎很不自然。dlopen

libssl.so另一种选择是在两个库中使用相同的共享。

于 2012-06-12T23:42:33.907 回答