ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

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

2019-12-10 11:51:28  阅读:300  来源: 互联网

标签:linker symbols 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有