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