首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >当使用dlopen加载库时收到"undefined symbol“错误

当使用dlopen加载库时收到"undefined symbol“错误
EN

Stack Overflow用户
提问于 2009-01-26 17:29:23
回答 2查看 24.2K关注 0票数 23

我正在编写一些使用动态共享库作为插件的代码。

用于构建共享库的命令行如下所示:

代码语言:javascript
复制
cc -shared -fPIC -o module.so -g -Wall module.c

在模块中,我可以调用在主可执行文件中加载的任何其他共享库中的函数。

但是,我不能访问(导出)可执行文件本身中的函数(我得到undefined symbol错误)。

我对dlopen的调用如下所示:

代码语言:javascript
复制
void *handle = dlopen(plugin, RTLD_NOW);

有没有人可以建议我的模块如何回调我的可执行文件,而不必将可执行文件的所有实用函数放入另一个共享库?

EN

回答 2

Stack Overflow用户

发布于 2009-01-27 07:31:38

正确的解决方案是将-rdynamic添加到主可执行文件的链接命令中。这将为ld添加适当的选项(在使用GNU ld时,恰好是--export-dynamic)。

直接添加--export-dynamic在技术上是不正确的:它是一个链接器选项,因此应该作为-Wl,--export-dynamic-Wl,-E添加。这也比-rdynamic的可移植性差(其他链接器也有等效项,但选项本身是不同的)。

票数 35
EN

Stack Overflow用户

发布于 2009-08-30 18:47:34

当我遇到同样的问题时,我只是使用了以下解决方案。在加载任何插件之前,只需加载程序本身,将其符号带到动态表中:

代码语言:javascript
复制
dlopen(NULL,RTLD_NOW|RTLD_GLOBAL);

我认为解决方案更好。原因是,它也解决了同样的问题,如果你

a)你的程序(或一个三方模块)与共享库链接(而不是在运行时),这些符号需要在动态表中;

b)无法使用-rdynamic标志重新编译该模块。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/480617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档