如果加载了错误的库,则dlopen失败

时间:2016-03-30 12:54:11

标签: c++ linux qt namespaces dynamic-loading

我无法加载我的自定义插件库,该库链接到使用自定义命名空间构建的自定义共享Qt库,如果已经将任何系统范围的Qt库加载到该进程中。

换句话说,我有myplugin.so。它使用自定义Qt库中的一些符号,所有这些符号都与命名空间前缀(例如myNS)的各个原始Qt符号不同。 ldd on myplugin.so显示了libQtCore.so.4,因此它没有指定任何次要的Qt版本。

我使用空的控制台应用程序(没有链接到Qt)完成了一些测试。

一个。通常的插件加载

dlopen("myplugin.so", RTLD_NOW);  // returns a non-null pointer, the plugin was loaded OK

B中。尝试使用预先加载的系统范围的QtCore库加载插件

dlopen("/usr/lib/x86_64-linux-gnu/libQtCore.so.4.8.7", RTLD_NOW);  // returns a non-null pointer
dlopen("myplugin.so", RTLD_NOW);  // returns a null pointer, the plugin was not loaded

dlerror给出了

  

未定义的符号:_ZN4myNS7QObject16staticMetaObjectE

℃。尝试通过预加载自定义QtCore库来解决测试B

dlopen("/usr/lib/x86_64-linux-gnu/libQtCore.so.4.8.7", RTLD_NOW);  // returns a non-null pointer
dlopen("libQtCore.so.4.8.6", RTLD_NOW);  // custom qt library, a non-null pointer returned
dlopen("myplugin.so", RTLD_NOW);  // returns a null pointer, the plugin was not loaded

dlerror产生相同的输出。

d。反转加载QtCore库的顺序有帮助

dlopen("libQtCore.so.4.8.6", RTLD_NOW);  // custom qt library, a non-null pointer returned
dlopen("/usr/lib/x86_64-linux-gnu/libQtCore.so.4.8.7", RTLD_NOW);  // returns a non-null pointer
dlopen("myplugin.so", RTLD_NOW);  // returns a non-null pointer, the plugin was loaded OK

根据测试C的结果,加载器尝试从第一个加载的库中解析符号,并且即使已经加载好,也会忽略另一个符号。

我做错了什么?我尝试过标记RTLD_NOW,RTLD_LAZY,RTLD_LOCAL,RTLD_GLOBAL的不同组合,但它们没有帮助。

我的任务是加载插件库,而不管其他加载的Qt库。

0 个答案:

没有答案