小编Vel*_*los的帖子

如果有重复的符号,如何可靠地使用dlsym?

晚上好,我目前正在使用基于Plux.net模型的C++/Linux插件系统.

为了简单起见,我基本上用extern C(to unmangle)声明一个符号(让我们称之为pluginInformation),我的插件管理器在预先配置的导入(.so)中查找该符号.

问题是主应用程序声明了相同的符号,不仅如此,它所具有的任何依赖关系也可能具有符号.(因为在这个插件信息中,模块可以发布插件和/或插槽).

因此,当我的PluginManager启动时,它首先尝试在主程序中找到符号(将NULL传递给dlopen),然后它尝试在其任何依赖项中找到符号(使用dl_iterate_phdr).最后它将dlopen一组配置导入(它将读取用户配置的.so的路径,dlopen它们,最后dlsym pluginInformation符号).

然后使用在所有模块中找到的pluginInformation的集合来构建扩展三.

如果我在主程序中声明符号并使用dlopen加载导入,它就可以工作(只要我在导入时失去标记RTLD_DEEPBIND).

但是对于应用程序依赖项,我没有选择传递标志(我可以,但它没有做任何事情),因为这个.sos是在应用程序启动时加载的.

现在,当我尝试使用从依赖项中获得的任何符号(启动时加载的符号)时,我会遇到分段错误.我假设问题是我在符号表中有几个同名的符号,奇怪的是它似乎正确地识别出有几个符号,它甚至给我正确的.so路径,其中符号是声明,但是一旦我访问该符号就会发生分段错误.如果我只在主程序或其中一个依赖项中声明符号,则一切正常.

如何使用dlsym管理主程序和strat up导入之间的重复符号?

我一直在考虑保持修剪,然后尝试找到符号表的符号,但我不确定这是否可能(以编程方式列出模块中的所有符号).

PD:对不起,我没有发布任何代码,但我现在不在家,我希望我试图做的描述很清楚,如果不是我可以明天发布一些代码.

c c++ linux dlopen dlsym

6
推荐指数
1
解决办法
1006
查看次数

标签 统计

c ×1

c++ ×1

dlopen ×1

dlsym ×1

linux ×1