问题现象:
最近和第三方开发软件功能,他们提供封装库给到我们,我们这边链接他们给的库之后,调用库中函数接口开发,软件编译跑起来之后正常,但是在调用我们这边系统库某个函数的时候会发生crash,并且多次测试crash位置不变。
问题分析:
crash发生在调用我们这边库函数的时候,首先怀疑是我们添加的代码有问题,仔细排查未找到异常点,索性直接把代码还原,编译的时候还是链接第三方库,结果还是会出现crash问题。这时候有点思路了,怀疑是不是第三方库和我们系统库有重名问题,重新编译代码,并且在编译的时候添加上-Wl,--as-needed参数,编译出执行文件之后,通过ldd查看到可执行文件还是依赖第三方库,这个时候确认就是重名问题引起了。
-Wl,--as-needed:指示最终的可执行文件中只包含必要的链接库信息
问题结论:
最后排查下来原因是第三方也会用到我们这边库,并且我们提供的是静态库,由于合作方案多,他们打包库给我们的时候链接错库,即A方案的库用到了B方案。我们使用的时候刚好也把他们的库放到了系统库前面。导致软件跑起来之后调用系统库函数的时候直接调用了他们库里面的函数,但是他们库里面的函数是其它方案的,这样就引起了crash。
问题措施:
重新提供一份对应的库给他们打包,再编译升级就正常了。