首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有重复符号的C++插件库的分段错误

具有重复符号的C++插件库的分段错误
EN

Stack Overflow用户
提问于 2009-11-30 17:20:45
回答 3查看 1.3K关注 0票数 7

我有一个跨平台的C++应用程序,它被分成几个共享库,并从插件共享库加载额外的功能。插件库应该是自包含的,并且是独立的,不需要调用应用程序的知识或依赖。

其中一个插件包含从主应用程序复制的代码,因此包含与引擎中的代码重复的符号名。(是的,我知道这通常是否定的,但在编写插件时,引擎是一个单块二进制文件,无法共享库。)在Windows上,一切都很好。在Linux上,我们得到了分段错误。通过查看错误的堆栈跟踪,它是在调用重复类名中的函数时在插件中发生的。这似乎是引擎和插件具有稍微不同版本的共享代码的结果(插件中注释掉了一些类功能)。就好像插件正在获取它的符号运行时链接到引擎,而不是它自己的。我们通过将dlopen的参数更改为dlopen(pFilepath, RTLD_LAZY | RTLD_LOCAL)来“修正”这个问题。

但是,当我们将引擎重写为共享库(为了在插件中重用的最终目的)时,我们再次得到了分段错误。看看堆栈跟踪,它来自引擎->插件->引擎。

是否有方法指定运行时链接器不将插件的符号映射到引擎(尤其是在插件中定义的情况下)?

谢谢!哑光

2009年编辑.12-3

我首先尝试将插件的代码包装在它自己的命名空间中。这不起作用,因为它静态地链接到一个库,这个库也链接到引擎。静态库的版本是不同的,所以分段错误!

然后,我改变了引擎的构建,它的库被静态链接。当我运行它时,我就不再有问题了。因此,这似乎是由于共享库符号被导出,然后在打开插件时被动态地重新定位到插件中的结果。但是,当引擎的所有代码都在一个可执行文件中时,它不会导出它的符号(因此它不会尝试将插件的符号重新定位到引擎中)。

不过,我仍然有一个问题,因为有一个并行版本的程序(使用Open),这仍然会导致分段错误。它似乎还在导出引擎的符号和重新定位插件,这可能与Open执行应用程序的方式有关。

是否有可以在插件共享库中使用的链接器标志来告诉它不要在运行时动态地重新定位符号?或者隐藏它的符号这样它们就不会被重新安置?我尝试过-s (“省略所有符号信息”),但这显然没有改变动态符号(使用nm -D <plugin>检查)。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-12-03 21:30:31

我想我找到了解决方案,链接标志-Bsymbolic。实际上,此标志在共享库中添加了一个标志,以告诉运行时链接器首先尝试并解析其内部的符号名。当插件与该标志链接时,引擎能够在所有情况下(单块exe、exe w/共享库、插件w/和w/o包装名称空间)使用插件运行。

似乎确实有一些对-Bsymbolic持警告态度的批评者

http://www.technovelty.org/code/c/bsymbolic.html

http://software.intel.com/en-us/articles/performance-tools-for-software-developers-bsymbolic-can-cause-dangerous-side-effects/

但考虑到他们的警告和插件的意图,我认为这是正确的选择。至少现在是这样。

票数 4
EN

Stack Overflow用户

发布于 2009-11-30 18:13:26

我同意格伦的观点--除非你修改类名,可能是通过名称空间,否则你不会真正解决这个问题。即使是36个文件也可能需要较少的时间来修改,而不是试图在不更改符号名的情况下可靠地修复它。

首先确定需要调整名称的所有类。你的链接器可能已经给你列出了。然后,我将至少暂时更改这两组类的名称(从Foo更改为Engine::Foo和Plugin::Foo )。这样,您就可以让编译器找到对有问题的类的所有引用。继续使用插件源代码,直到插件编译时引用正确的新插件类名。完成之后,将Engine::类更改回它们的旧名称(除非您也想永久修改引擎源,这听起来是不可能的)。插件现在应该编译并链接到正确的、唯一命名的类。

票数 1
EN

Stack Overflow用户

发布于 2009-11-30 19:46:47

我只需要用一个PluginX命名空间包装插件的所有代码。这肯定会让你免于犯这些错误。这是一个非常好的,重要的,无论如何练习。

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

https://stackoverflow.com/questions/1821153

复制
相关文章

相似问题

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