linux 动态库的符号冲突问题
2024-08-27 10:41:18
最近,给同事定位了一个符号表的冲突问题,简单记录一下。
A代码作为静态链接库,被包含进了B代码,然后编译成了动态链接库,B.so
A代码同时作为静态链接库,被编译进入了main的主代码。
main函数调用B.so里面的函数,同时B.so里面的函数调用了A代码,结果进程异常退出了。
查看符号表,发现调用的A代码,其实运行的是直接编译进入main主函数的代码,而不是B.so里面包含的A代码。
而且比较凑巧的是,符号名称是相同的,但是代码逻辑却不相同,
由于是arm的嵌入式单板,所有的空间被设置成了只读,导致无法生成core文件,还花了几个小时去分析。
那么,怎么避免这种情况?
1.如果我们要求so文件优先使用自己的库文件内的符号,需要在编译时使用-Wl,-Bsymbolic参数,这是个链接参数,会被传递给连接器ld使用,告诉so,优先使用库内符号。
2.我们还要考虑我们自身库的符号先得到加载的话,不会去覆盖其他库或者程序的符号,因此这里需要将不必导出的符号进行隐藏,只导出外部需要使用的符号。
这里我们在编译时使用-fvisibility=hidden参数来隐藏符号,但是只这样的话会把库内的所有的符号都隐藏了,包括调用者需要的函数,于是我们在需要导出的的函数和变量前加上
__attribute__ ((visibility ("default")))属性,这样就可以使用导出的函数了。
最新文章
- Zend Studio XDebug调试配置
- 自动生成V字型
- 提高Baidu Map聚合的效率
- java高薪之路__008_Annotation
- 【转】ubuntu下安装eclipse以及配置python编译环境
- 慕尼黑大学公开课 Competitive Strategy(竞争策略)总结
- b9934107349625014ec251e1333d73a8 这个代码是mad5值
- 二维码开源库ZBar-MDK STM32F429移植
- J.U.C-volatile
- linux sort排序及取前几条数据
- Nginx 拒接服务漏洞(CVE-2016-0747)整改
- JSP 基础(二)
- mysql小试题3
- Solidworks如何把装配体做成单个零件
- Android——Activity去除标题栏和状态栏
- Js数组和字符串常用方法
- python的dict()字典数据类型的方法详解以及案例使用
- 解决 The word is not correctly spelled问题
- Django Admin定制
- Apache2.4.34 + php 7.28 + MySQL8.0.12 安装及配置
热门文章
- Python的locals()函数
- [Spark内核] 第28课:Spark天堂之门解密
- appium-chromedriver@3.0.1 npm ERR! code ELIFECYCLE npm ERR! errno 1
- Windows AD域升级方
- [转载]mysql创建临时表,将查询结果插入已有表中
- CentOS7配置静态IP
- css3 移动端 开关效果
- jq交叉淡入淡出轮播图
- JDBC简单范例
- 循序渐进之Spring AOP(3) - 配置代理