系统相关
首页 > 系统相关> > 将符号限制为linux可执行文件的本地作用域

将符号限制为linux可执行文件的本地作用域

作者:互联网

任何人都可以提出一些建议,以限制将符号导出到全局符号表吗?

提前致谢

你好

感谢回复…

实际上,我有一个可执行文件,该可执行文件静态链接到第三方库,例如“ ver1.a”,并且还使用了第三方“ .so”文件,该文件再次与相同的库链接,但版本不同,即“ ver2.a”.问题是这两个版本的实现都不相同.开始时,加载可执行文件时,“ ver1.a”中的符号将被导出到全局符号表中.现在,无论何时加载“ .so”,它都将尝试引用来自ver2.a的符号,最终将引用先前已加载的“ ver1.a”中的符号.因此,我们的二进制文件崩溃了.

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

我找不到任何方法可以限制将符号导出到全局符号表.我尝试了–version-script和keep-symbol-file,但是没有用.对于-fvisibility = hidden选项,其错误提示“ -f选项只能与-shared一起使用”.因此,我想这也像“ –version-script”仅适用于共享库,不适用于可执行二进制文件.

代码在c,OS-Linux,gcc版本3.2中.可能无法重新编译任何第三方库和“ .so”.因此,排除了使用bsymbolic标志重新编译“ so”文件的选项.

任何帮助,将不胜感激.

解决方法:

使用dlopen拉入第3方库.

您可能可以通过创建自己的共享库来避免这种情况,该共享库将隐藏所有第三方符号,并仅向它们公开您自己的API,但是如果其他所有方法都失败,则dlopen可以完全控制您.

标签:linker,symbols,linux
来源: https://codeday.me/bug/20191210/2101420.html