我有共享对象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静态链接到每个共享对象,因为它们是暴露的 全局可能是共享相同的符号而不是选择它的本地副本。
这是什么解决方法?如何在这里制作符号?
请帮忙
答案 0 :(得分:5)
这确实是预期的。 libssl.a
的一个实例设置(可能是其中一个子集),结果并不漂亮。您可以使用版本脚本(--version-script
为ld,而-Wl,
代表cc)来控制从A.so
和B.so
导出的内容。如果某些内容未导出,则也无法插入。
或者,您可以使用libssl.a
等可见性标记编译-fvisibility=hidden
。这些标志仅影响动态链接器而不影响静态链接。您可能需要自己编译它,因为传送的.a
文件往往包含位置相关的代码,用于链接到可执行文件。只有某些平台(如32位x86)才能让您将这些代码链接到共享对象中,而且只能以文本重定位为代价。
评论中建议的dlopen
RTLD_LOCAL
也应该有用,但为此目的使用dlopen
似乎很苛刻。
另一种选择是在两个库中使用相同的共享libssl.so
。