undefined symbol: __gmpz_limbs_write 问题分析和解决

一、问题

最近用git克隆项目时出现了如题的报错,一顿操作下来,发现这库还是个系统库,没法更新也不能卸载重装,对比了另一台ubuntu文件的md5发现文件也没有损坏。。。
在这里插入图片描述

二、分析

  • 1、使用 ldd -r 指令,查看该文件依赖了哪些动态库,并且存在哪些 undefined symbol 符号
ldd -r /lib/x86_64-linux-gnu/libgnutls.so.30

可以看到未定义的符号挺多,而且报错符号确实来自该动态库
在这里插入图片描述

  • 2、使用指令 readelf -s 确认 libgnutls.so.30 里面定义了该符号(函数)
readelf -s /lib/x86_64-linux-gnu/libgnutls.so.30 | grep __gmpz_limbs_write

可以看到动态库里面确实定义了这个全局符号,那问题是什么呢?难道是函数调用不了?
在这里插入图片描述
检查前面的过程,可以看到有个比较"离谱"的路径。这里的意思是说 libgnutls.so.30 依赖了另一个动态库 libgmp.so.10,而该动态库来自路径 /disk/sdk/compiler/…,想都不用想,这肯定是不对的呀!
在这里插入图片描述
在相同的系统路径下,我们可以找到这个动态库本体正确的位置。那究竟是什么时候链接出错了呢?
在这里插入图片描述

  • 3、检查 LD_LIBRARY_PATH 环境变量。(容易混淆的还有另一个环境变量 PATH,可以简单理解为前者是用来为执行程序找动态库的,而后者是用来找执行程序的,两个打配合,我们就可以在任意目录下运行一个其它地方的执行程序了)
echo $LD_LIBRARY_PATH

可以看到路径 /disk/sdk/compiler/… 确认来自该环境变量
在这里插入图片描述

通过这么一查,我就想起来了,是我之前配置过 ~/.bashrc,在里面添加过环境变量。注释掉下面两行,重启电脑,问题解决!

在这里插入图片描述

三、总结

  • 1、使用指令 ldd -r 检查来源动态库,确认符号所在文件、确认有无异常的链接库来源;

  • 2、确认动态库内是否定义了某个函数符号,可以用指令 readelf -s (其实也可以用 strings 指令);

  • 3、出现异常的链接库来源,多数是由环境变量 LD_LIBRARY_PATH 引入的,检查在哪里配置过该环境变量,修复后重启电脑即可。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值