Linux:解决应用程序/动态库中与加载的其他动态库的函数 重名问题

56 篇文章 1 订阅

Linux:解决应用程序/动态库中与加载的其他动态库的函数 重名问题

问题 :

今天客户提出来一个大问题,Linux版本的一段程序,显示正常的pdf在识别的时候,程序崩了,这个不应该啊。就算pdf是坏的,那也应该有错误码,而不应该崩掉啊。
在复现的过程中,gdb调试发现,在我们的动态库A.so中有个接口叫F_Recg(),我们调用的底层还有个用的别人提供的动态库B.so,其中有个函数也叫F_Recg(),最终的问题就是本应该进入A.so中F_Recg()程序进入到了B.so中的F_Recg()了

别人的动态库我们也不能改,只能我们自己想办法看看怎么指定的调用我们A.so中的函数了。

刚开始尝试了visibility(visibility用于设置动态链接库中函数的可见性,将变量或函数设置为hidden,则该符号仅在本so中可见,在其他库中则不可见;若设置为default,则在其他库中也可见。使用方法参见:visibility)但是没有效果。
所幸后来在同事大佬的帮助下,我们找到了一种gcc编译选项的方法:

-Wl,-Bsymbolic (不要少逗号)
这个是在gcc/g++编译的一个选项,其中Wl表示将紧跟其后的参数,传递给连接器ld。Bsymbolic表示强制采用本地的全局变量定义,这样就不会出现动态链接库的全局变量定义被应用程序/动态链接库中的同名定义给覆盖了!

解决方法:

添加gcc / g++编译选项: -Wl,-Bsymbolic

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值