静态库加载两次

时间:2012-06-12 22:38:07

标签: c linker static-libraries static-linking double-free

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

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

我有一个可执行文件a.out,它可以加载A.so和B.so.当a.out终止时,我得到一个 A.so。中的libssl.a中的一个符号中的双重自由错误。

即使libssl.a静态链接到每个共享对象,因为它们是暴露的 全局可能是共享相同的符号而不是选择它的本地副本。

这是什么解决方法?如何在这里制作符号?

请帮忙

1 个答案:

答案 0 :(得分:5)

这确实是预期的。 libssl.a的一个实例设置(可能是其中一个子集),结果并不漂亮。您可以使用版本脚本(--version-script为ld,而-Wl,代表cc)来控制从A.soB.so导出的内容。如果某些内容未导出,则也无法插入。

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

评论中建议的dlopen RTLD_LOCAL也应该有用,但为此目的使用dlopen似乎很苛刻。

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