静态库加载两次(Static library loaded twice)

2019-06-25 10:25发布

我已经共享对象A.so其中静态链接到libssl.a&另一个共享对象B.so也静态链接libssl.a。

A.so&B.so具有从在全局范围libssl.a符号。 我用readelf -s A.so选中此

我有它加载A.so和B.so.可执行的a.out 当a.out的终止,我得到一个双无错误的标志之一,从A.so. libssl.a

即使libssl.a静态链接到每个共享对象,因为它们在全球范围内暴露有没有可能相同的符号是共享的,而不是采摘它的本地副本。

解决办法呢? 如何使本地符号在这里?

请帮忙

Answer 1:

这确实是预期。 的一个实例libssl.a介于(可能的子集),另外,其结果是不漂亮。 您可以使用版本脚本( --version-script给ld,与-Wl,为CC)控制哪些是从出口A.soB.so 。 如果不出口的东西,它也不能被插入。

另外,你可以编译libssl.a能见度标志像-fvisibility=hidden 。 这些标志只影响动态连接器,而不是静态链接。 您可能需要自己反正编译它,因为发货.a文件往往包含与位置相关的代码,这意味着用于链接到可执行文件。 只有一些平台,如32位x86让你跟这样的代码链接到共享对象,并且仅在文本重的代价脱身。

dlopenRTLD_LOCAL在评论建议也应该工作,但它似乎的hackish使用dlopen用于此目的。

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



文章来源: Static library loaded twice