静态库加载两次

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静态链接到每个共享对象,由于它们全局公开,因此可能共享相同的符号而不是选择它的本地副本.

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

请帮忙

jil*_*les 5

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

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

注释中建议的dlopenwith RTLD_LOCAL也应该有用dlopen,但似乎是用于此目的的hackish .

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