openssl版本不同引发的崩溃

本文介绍了一种在运行环境上,让程序使用自己的动态库的方法。该方法可以避免由于运行环境存在动态库的多个版本而引发的各种问题,如崩溃等。

实际项目中遇到了程序崩溃问题,但是在其它环境是正常的,下面进行问题分析:

1.崩溃栈信息

(gdb) bt

#0 0x00007f76899da13e in ?? () from /usr/lib64/libc.so.6

#1 0x000000000075e7cd in lh_insert ()

#2 0x000000000072ec27 in OBJ_NAME_add ()
#3 0x00007f7687cacc98 in ?? () from /usr/lib64/libssl.so.1.1

#4 0x00007f76898f1d68 in ?? () from /usr/lib64/libc.so.6

#5 0x00007f7687b7b229 in CRYPTO_THREAD_run_once () from /usr/lib64/libcrypto.so.1.1

#6 0x00007f7687cacee3 in OPENSSL_init_ssl () from /usr/lib64/libssl.so.1.1
#7 0x00007f768982e7b0 in ?? () from /usr/lib64/libcurl.so.4

#8 0x00007f76897df073 in ?? () from /usr/lib64/libcurl.so.4

................

观察以上信息,可以看出是libssl.so.1.1引起的崩溃。程序在其它环境运行正常,因此在确认代码基本没问题后,推断可能由于openssl库的问题引起。进一步看下堆栈,发现由于libcurl.so.4调用了openssl引发的崩溃。

2.确认openssl和curl版本

由于libssl.so和libcrypto.so是配套的,因此也需要看crypto

崩溃环境崩溃程序依赖库:

libssl.so.1.1 => /usr/lib64/libssl.so.1.1 (0x00007fbb42ebe000)

libcrypto.so.1.1 => /usr/lib64/libcrypto.so.1.1 (0x00007fbb42bd1000)

libcurl.so.4 => /usr/lib64/libcurl.so.4 (0x00007fbb44edb000)

正常环境崩溃程序依赖库:

libssl.so.0.9.8 => /usr/lib64/libssl.so.0.9.8 (0x00007f1ca2afc000)

libcrypto.so.0.9.8 => /usr/lib64/libcrypto.so.0.9.8 (0x00007f1ca2781000)

libcurl.so.4 => /usr/lib64/libcurl.so.4 (0x00007f1ca494f000)

发现openssl版本不同。

3.统一openssl版本

尝试仅指定程序自己路径下的openssl动态库。方法为使用正常环境的openssl并用rpath指定,即在程序运行目录下创建./lib,并在编译时增加-Wl,-rpath=./lib/,同时将libssl.so.0.9.8和libcrypto.so.0.9.8拷贝到程序运行目录的./lib下。重新编译程序。

但不幸的是,程序依然崩溃。通过ldd查看可执行文件依赖库,发现仍然使用系统自带的/usr/lib64/libcurl.so.4,进而继续调用系统自带的/usr/lib64/libssl.so.1.1。

4.统一curl版本

继续将程序使用的curl指定为程序自己路径下的libcurl.so.4。将正常环境的libcurl.so.4拷贝到./lib。重新编译。

libssl.so.0.9.8 => ./lib/libssl.so.0.9.8 (0x00007f430876d000)

libcrypto.so.0.9.8 => ./lib/libcrypto.so.0.9.8 (0x00007f43083f2000)

libcurl.so.4 => ./lib/libcurl.so.4 (0x00007f430a5c4000)

通过ldd查看,程序已经使用了正常环境版本的openssl和curl库,运行程序不再崩溃。

5.总结

如果程序不指定具体某依赖库libXXX.so,会到系统目录中寻找,找到libXXX.so后,libXXX.so会继续在系统路径下寻找libXXX.so的依赖库。这时,即使程序指定了libXXX.so需要的依赖库也无效。解决办法是通过rpath指定程序自己的依赖库。

相关推荐
落羽凉笙3 分钟前
Python基础(4)| 详解程序选择结构:单分支、双分支与多分支逻辑(附代码)
android·服务器·python
ONLYOFFICE10 分钟前
入门指南:远程运行 ONLYOFFICE 协作空间 MCP 服务器
运维·服务器·github·onlyoffice
qq_3985865415 分钟前
Debian12远程方案xrdp、kasmvnc、novnc
linux·debian·rdp·novnc·kasmvnc
Dovis(誓平步青云)16 分钟前
《Linux 核心 IO 模型深析(中篇):探索Cmake与多路转接的高效实现poll》
linux·运维·服务器·数据库·csdn成长记录
EveryPossible20 分钟前
cpu展示示例
服务器
Java 码农24 分钟前
RabbitMQ集群部署方案及配置指南01
linux·服务器·rabbitmq
郝学胜-神的一滴35 分钟前
深入理解Linux中的Try锁机制
linux·服务器·开发语言·c++·程序人生
Java后端的Ai之路36 分钟前
【AutoDL算力平台】-MobaXterm 连接 AutoDL 并上传文件资源(图文 + 实操)
服务器·网络·mobaxterm·autodl算力平台
阿巴~阿巴~39 分钟前
NAT技术:互联网连接的隐形桥梁
服务器·网络·网络协议·架构·智能路由器·nat·正反向代理
DevOps-IT41 分钟前
HTTP状态码(常见 HTTP Status Code 查询)
运维·服务器·网络·网络协议·http