问题libm.so.6: version `GLIBC_2.27‘ not found的解决方法

本文介绍了在不升级系统的情况下,如何解决Ubuntu 18.04和16.04之间glibc版本不兼容的问题。通过使用objdump命令分析库文件,找出依赖的新版本glibc_2.27的符号,如expf函数,并在代码中指定旧版本glibc的符号链接,从而使得程序能在Ubuntu 16.04上成功运行。
摘要由CSDN通过智能技术生成

造成问题原因:ubuntu18.04系统编译的库和ubuntu16.04的库对于glibc的版本不一样

本地18.04系统:strings /lib/x86_64-linux-gnu/libm.so.6 | grep GLIBC_

服务器16.04系统:

在不升级系统的前提下解决方法:

  1. 检查一下该程序使用了新版本 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上运行了。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值