我正在开发一个程序,使用dlopen在CentOS上加载用户创建的插件。但是我遇到了一个问题,因为该插件依赖于其他共享库:
libplugin.so -> libservices.so -> libconfig.so
我们的程序首先将依赖项加载到内存中,从依赖树的叶子节点开始向上移动到插件(在这个示例中省略了错误检查):
dlopen("/path_to_plugin/libconfig.so", RTLD_NOW | RTLD_GLOBAL)
dlopen("/path_to_plugin/libservices.so", RTLD_NOW | RTLD_GLOBAL)
dlopen("/path_to_plugin/libplugin.so", RTLD_NOW | RTLD_GLOBAL)
我们采用这种方法是为了使最终用户无需修改LD_LIBRARY_PATH以指向插件所在的目录。这种方法已经成功地应用于多个不同的插件。
最近我们收到了一个新的插件,但是这种方法无法使用。我们可以成功加载libconfig.so,但当我们尝试加载libservices.so时,会出现以下错误信息:
Exception libconfig.so: cannot open shared object file: No such file or directory
我知道库之间的符号依赖关系都得到了满足,因为当我将LD_LIBRARY_PATH设置为包含插件路径时,插件可以正确地加载和执行。
当我在程序上运行strace时,我可以看到系统正在执行dlopen手册中描述的libconfig.so搜索。因此,似乎由于某种原因,dlopen未检测到已经加载了libconfig.so。可能会导致这种行为的情况是什么?
ltrace
进行检查,确保libconfig.so
的dlopen
被调用了两次,并且参数和路径完全相同。 - Basile Starynkevitch*.so
,并以项目名称为前缀存储在系统库目录中。这与 autotools 特别兼容,甚至可以从开发树运行。请参见 https://sourceware.org/git/?p=netresolve.git;a=blob;f=Makefile.am;h=4223162b82e539c1d9c623776962ac0654301c18;hb=HEAD#l78 - Pavel Šimerda