我已经共享对象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静态链接到每个共享对象,因为它们在全球范围内暴露有没有可能相同的符号是共享的,而不是采摘它的本地副本。
解决办法呢? 如何使本地符号在这里?
请帮忙
这确实是预期。 的一个实例libssl.a
介于(可能的子集),另外,其结果是不漂亮。 您可以使用版本脚本( --version-script
给ld,与-Wl,
为CC)控制哪些是从出口A.so
和B.so
。 如果不出口的东西,它也不能被插入。
另外,你可以编译libssl.a
能见度标志像-fvisibility=hidden
。 这些标志只影响动态连接器,而不是静态链接。 您可能需要自己反正编译它,因为发货.a
文件往往包含与位置相关的代码,这意味着用于链接到可执行文件。 只有一些平台,如32位x86让你跟这样的代码链接到共享对象,并且仅在文本重的代价脱身。
该dlopen
与RTLD_LOCAL
在评论建议也应该工作,但它似乎的hackish使用dlopen
用于此目的。
另一种选择是使用相同的共享libssl.so
在两个库。