我正在编写一些使用动态共享库作为插件的代码.
我用于构建共享库的命令行如下所示:
cc -shared -fPIC -o module.so -g -Wall module.c
在模块中,我可以调用已在主可执行文件中加载的任何其他共享库中的函数.
但是,我无法访问可执行文件本身的(导出的)函数(我收到undefined symbol
错误).
我的电话dlopen
看起来像这样:
void *handle = dlopen(plugin, RTLD_NOW);
谁能告诉我的模块如何回调我的可执行文件,而不必将所有可执行文件的实用程序功能放入另一个共享库中?
正确的解决方案是添加-rdynamic
到主可执行文件的链接命令.这将添加适当的选项ld
(当使用时GNU ld
,恰好是--export-dynamic
).
--export-dynamic
直接添加在技术上是不正确的:它是一个链接器选项,因此应添加为-Wl,--export-dynamic
,或-Wl,-E
.这也不如-rdynamic
(其他连接器具有等效的,但选项本身不同).
我自己找到了答案.
我不得不将--export-dynamic
标志添加到主可执行文件的链接选项中.
创建动态链接的可执行文件时,将所有符号添加到动态符号表中.动态符号表是在运行时从动态对象可见的符号集.
如果不使用此选项,则动态符号表通常仅包含链接中提到的某个动态对象引用的那些符号.
如果使用"dlopen"加载需要引用程序定义的符号的动态对象,而不是某些其他动态对象,则在链接程序本身时可能需要使用此选项.