错误描述
我在使用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库的调用文件因为某些原因损坏了