从另一个动态库加载的动态库中的重复符号

时间:2018-09-20 16:25:59

标签: linux android-ndk shared-libraries dynamic-linking dlopen

我遇到了两个共享库的情况,我们称它们为libA.so和libB.so。 libA.so通过dlopen()加载并使用单例。 libA.so有时会通过dlopen()加载libB.so,后者也使用相同的单例。不幸的是,动态链接器无法将这tho个单例符号合并为一个,结果是两个单例实例。

当可执行文件和动态加载的库发生这种情况时,我知道通常的解决方案是在链接可执行文件时添加-rdynamic。这在这里不起作用。这两个库中的符号都导出为V,我不知道该怎么做才能使动态链接器将它们合并在一起。

编辑:这已在Android上进行了测试,似乎是特定于Android的,而不是通用的。

1 个答案:

答案 0 :(得分:0)

  

libA.so通过dlopen()加载并使用单例。 libA.so有时会通过dlopen()加载libB.so,后者也使用相同的单例。不幸的是,动态链接器无法将这tho个单例符号合并为一个,结果是两个单例实例。

我可以在一个简单的例子上重现此内容,但是仅当加载libA.so时使用RTLD_LOCAL标志。如果我使用RTLD_GLOBAL,则libA.solibB.so之间共享的变量将解析到第一个加载的实例(在libA.so内部)。

我相信这是按设计工作的。