我正在编写一些使用动态共享库作为插件的代码。
用于构建共享库的命令行如下所示:
cc -shared -fPIC -o module.so -g -Wall module.c
在模块中,我可以调用在主可执行文件中加载的任何其他共享库中的函数。
但是,我不能访问(导出)可执行文件本身中的函数(我得到undefined symbol
错误)。
我对dlopen
的调用如下所示:
void *handle = dlopen(plugin, RTLD_NOW);
有没有人可以建议我的模块如何回调我的可执行文件,而不必将可执行文件的所有实用函数放入另一个共享库?
发布于 2009-01-27 07:31:38
正确的解决方案是将-rdynamic
添加到主可执行文件的链接命令中。这将为ld
添加适当的选项(在使用GNU ld
时,恰好是--export-dynamic
)。
直接添加--export-dynamic
在技术上是不正确的:它是一个链接器选项,因此应该作为-Wl,--export-dynamic
或-Wl,-E
添加。这也比-rdynamic
的可移植性差(其他链接器也有等效项,但选项本身是不同的)。
发布于 2009-08-30 18:47:34
当我遇到同样的问题时,我只是使用了以下解决方案。在加载任何插件之前,只需加载程序本身,将其符号带到动态表中:
dlopen(NULL,RTLD_NOW|RTLD_GLOBAL);
我认为解决方案更好。原因是,它也解决了同样的问题,如果你
a)你的程序(或一个三方模块)与共享库链接(而不是在运行时),这些符号需要在动态表中;
b)无法使用-rdynamic标志重新编译该模块。
https://stackoverflow.com/questions/480617
复制相似问题