造成问题原因:ubuntu18.04系统编译的库和ubuntu16.04的库对于glibc的版本不一样
本地18.04系统:strings /lib/x86_64-linux-gnu/libm.so.6 | grep GLIBC_
服务器16.04系统:
在不升级系统的前提下解决方法:
- 检查一下该程序使用了新版本 glibc_2.27 的哪些符号,使用 objdump 命令可以查看 ELF 文件的动态符号信息,使用命令objdump -x libZTVA.so | grep GLIBC_2.27,显示内容如下:
可以看到调用了expf函数,这时去代码里搜发现没有该符号,于是通过反汇编,查找相关的函数调用:objdump -dS libZTVA.so >dump.txt
去dump.txt中搜索刚才的符号,可以看到:
float SortTracking::ExpCost(const BBox &rectA, const BBox &rectB, const float Qdist, const float Qshp){
22bc92: 55 push %rbp
22bc93: 48 89 e5 mov %rsp,%rbp
'''''''
'''''''
float Cexp = exp(index1) * exp(index2);
22be8f: 8b 45 f4 mov -0xc(%rbp),%eax
22be92: 89 45 98 mov %eax,-0x68(%rbp)
22be95: f3 0f 10 45 98 movss -0x68(%rbp),%xmm0
22be9a: e8 c1 5d ee ff callq 111c60 <_ZSt3expf@plt>
22be9f: f3 0f 11 45 98 movss %xmm0,-0x68(%rbp)
22bea4: 8b 45 f8 mov -0x8(%rbp),%eax
22bea7: 89 45 90 mov %eax,-0x70(%rbp)
22beaa: f3 0f 10 45 90 movss -0x70(%rbp),%xmm0
22beaf: e8 ac 5d ee ff callq 111c60 <_ZSt3expf@plt>
其实expf是ExpCost函数调用的,去原始工程中找到ExpCost函数,在调用了ExpCost函数的c代码中,指定相应的符号链接到对应GLIBC版本的符号表:
__asm__(".symver ExpCost,ExpCost@GLIBC_2.2.5");
重新编译,代码可以成功在ubuntu16.04上运行了。