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


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

你可能感兴趣的:(C++,Linux)