Jar运行crash

在内网环境中,运行Java-jar项目时遇到ld-linux-x86-64.so.2相关崩溃错误。项目依赖C++开发的加密解密so库,崩溃发生在调用so库时。ld-linux-x86-64.so.2是动态加载库的组件。尝试了多种解决方案如配置环境变量、更换JDK、升级内核等无效。最后通过删除并重新复制so库解决了问题,可能是由于so库更新或损坏导致的问题。
摘要由CSDN通过智能技术生成

错误描述

我在使用java -jar 运行我们的jar项目过程中,出现

C [ld-linux-x86-64.so.2+0x9d6d] do_lookup_x+0x6db

的crash错误

由于处于内网机中,完整的日志我就不展示了。

我先说一下项目中大概是在什么地方会崩溃吧。由于项目中需要使用到C++开发的文件内容的加密和解密功能,因此就使用到他们的so库,每次被崩溃就发生在java调用本地so库的过程中。

我们可以看看ld-linux-x86-64.so.2的作用是什么?

这是网上找到的解释:/lib/ld-linux.so.2以及它的64位版本/lib64/ld-linux-x86-64.so.2雖然看起來是共享庫文件,但實際上他們可以獨立運行。他們的功能是負責動態加載。 它們通過讀取可執行文件的頭部信息來確定哪些庫文件是必須的,以及哪些需要加載。 加載完成後,它會通過修正執行文件裡的相關的地址指針來和加載的庫文件完成動態鏈接,此時程序就可以運行了。

我的理解的话,就是当我的jar中的代码需要调用so库的时候,就会通过ld-linux-x86-64.so.2来加载需要调用的so库,相当于一个中间的转接器一样。

解决思路

网上也搜了很多的解决方法,这里提供几种网上的思路:

1. 配置环境变量:  export LD_BIND_NOW=1

2. openJDK有问题,替换openJDK

3. linux内核有bug,升级内核

4. 代码调用so的过程中,产生了数据越界

5. so库本身存在bug

....

 但是以上的方法并没有解决我的问题,最终在各种尝试下,我的解决方法是

删除linux中/lib64(不一定只是在/lib64这个目录,我的项目中so是复制到linux的环境变量java.library.path锁代表的路径下,不止包含了lib64)下我jar复制过去的so库,比如我jar里面导入的so库是test.so,那我就去删除/lib64下相同名字的so,重新执行java -jar  xxx.jar命令,在执行过程中重新将so复制到/lib64下,问题得以解决。

目前并不能确定为什么能解决的根本原因。现在猜测

1. 应该是中间有更新过so库,但是可能因为名字还是那个名字,因此linux lib64中的so就没更新。
2. 也有可能在运行中,so库的调用文件因为某些原因损坏了

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值