晚上好,我目前正在使用基于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:对不起,我没有发布任何代码,但我现在不在家,我希望我试图做的描述很清楚,如果不是我可以明天发布一些代码.