首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将符号限制在linux可执行文件的本地范围内

将符号限制在linux可执行文件的本地范围内
EN

Stack Overflow用户
提问于 2009-11-26 16:26:15
回答 3查看 1.8K关注 0票数 2

谁能建议一下我们可以限制我们的符号输出到全球符号表的方法吗?

提前感谢

嗨,

谢谢你回复..。

实际上,我有一个静态链接到第三方库的可执行文件,比如"ver1.a“,还使用了第三方".so”文件,该文件再次链接到同一个库,但不同的版本称为"ver2.a“。问题是这两个版本的实现是不同的。在开始加载可执行文件时,"ver1.a“中的符号将被导出到全局符号表中。现在,每当加载".so“时,它将尝试引用版本2.a中的符号,最后将引用"ver1.a”中的符号,这些符号以前是loaded.Thus破坏我们的二进制文件的。

我们想出了一个解决方案,就是我们不会将用于可执行文件的符号导出到全局符号表中,因此,当".so“加载并尝试使用ver2.a中的符号时,它将不会在全局符号表中找到它,它将使用自己的符号,即ver2.a中的符号。

我找不到任何方法来限制将符号导出到全局符号表。我试过-版本-脚本和保留符号-文件,但它没有工作。对于-fvisibility=hidden选项,它提供了一个错误,即“-f选项只能与-shared一起使用”。所以我想,这个类似于“--版本-脚本”的方法只适用于共享库,而不是可执行的二进制文件。

代码是在c++,OS,gcc版本-3.2.可能不可能重新编译任何第三方库,因此排除了使用b符号标志重新编译“So”文件的选项。

任何帮助都将不胜感激。

EN

回答 3

Stack Overflow用户

发布于 2009-11-26 16:33:41

用dlopen拉进第三方图书馆。

您可以通过创建自己的共享库来避免这种情况,该库隐藏了所有第三方符号,并且只向它们公开了您自己的API,但如果其他所有操作失败,dlopen将为您提供完全的控制。

票数 2
EN

Stack Overflow用户

发布于 2009-12-04 16:39:16

我有一个类似的问题/问题:Segfault on C++ Plugin Library with Duplicate Symbols

如果可以重新构建第三方库,可以尝试添加链接器标志-Bsymbolic ( gcc/g++的标志将是-Wl,-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/

如果你不能重建它,根据第一个警告链接:

实际上,在构建共享库时,

标志所做的唯一事情就是在名为DT_SYMBOLIC的二进制文件的动态部分中添加一个标志。

所以,也许有一种方法可以将DT_SYMBOLIC标志添加到动态节post链接中?

票数 1
EN

Stack Overflow用户

发布于 2009-11-27 04:52:47

最简单的解决方案是在可执行文件中重命名符号(通过更改源代码),这样它们一开始就不会与共享库冲突。

下一个最简单的事情是用'objcopy -L problem_symbol'定位“问题”符号。

最后,如果您没有直接链接到第三方库(但像bmargulies所建议的那样,而是直接打开它),并且您的其他共享库都没有使用定义"problem“符号,并且您也没有链接到-rdynamic或其相应的代码之一,那么该符号不应该导出到可执行文件的动态符号表中,因此您不应该有冲突。

注意:'nm a.out'仍然会将符号显示为全局定义,但这对于动态链接并不重要。您希望使用a.out'nm -D a.out'来查看动态符号表。

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

https://stackoverflow.com/questions/1804622

复制
相关文章

相似问题

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