我遇到了两个共享库的情况,我们称它们为libA.so和libB.so。 libA.so通过dlopen()加载并使用单例。 libA.so有时会通过dlopen()加载libB.so,后者也使用相同的单例。不幸的是,动态链接器无法将这tho个单例符号合并为一个,结果是两个单例实例。
当可执行文件和动态加载的库发生这种情况时,我知道通常的解决方案是在链接可执行文件时添加-rdynamic。这在这里不起作用。这两个库中的符号都导出为V
,我不知道该怎么做才能使动态链接器将它们合并在一起。
编辑:这已在Android上进行了测试,似乎是特定于Android的,而不是通用的。
答案 0 :(得分:0)
libA.so通过dlopen()加载并使用单例。 libA.so有时会通过dlopen()加载libB.so,后者也使用相同的单例。不幸的是,动态链接器无法将这tho个单例符号合并为一个,结果是两个单例实例。
我可以在一个简单的例子上重现此内容,但是仅当加载libA.so
时使用RTLD_LOCAL
标志。如果我使用RTLD_GLOBAL
,则libA.so
和libB.so
之间共享的变量将解析到第一个加载的实例(在libA.so
内部)。
我相信这是按设计工作的。