openssl版本不同引发的崩溃

embedded/2024/10/19 2:21:23/

        本文介绍了如何避免由于运行环境存在动态库的多个版本而引发的各种问题,如崩溃等。

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

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指定程序自己的依赖库。同时,不需对系统做任何修改,不对运行环境产生任何影响。

        另外,关于rpath的注意事项可参考本人另一篇文章《Linux so动态库路径搜索顺序》


http://www.ppmy.cn/embedded/93448.html

相关文章

大数据算法岗位分析推荐:基于Python的招聘大数据爬虫可视化分析推荐系统(完整系统源码+数据库+详细开发文档+万字论文+详细部署教程等全资料)

文章目录 大数据算法岗位分析推荐:基于Python的招聘大数据爬虫可视化分析推荐系统(完整系统源码数据库详细开发文档万字论文详细部署教程等全资料)源码等全资料获取在文章末尾一、项目概述二、项目说明三、研究意义四、系统总体架构设计总体框…

Adobe Substance 3D Sampler v4.2.2.3719 解锁版下载及安装教程(3D材质管理软件)

前言 Substance 3D Sampler简称“Sa”是一款由Adobe新推出的3D真实材质贴图制作软件。允许用户通过调整和混合现有材料,或通过扫描(单个或多个图像)中提取新材料来创建和迭代材料集合,从而轻松将真实的图片转换为具有真实感的表面…

给python初学者的一些建议

写在开篇 关于Python,可以这么说,这几年借着数据科学、机器学习与人工智能的东风,Python 老树开新花,在风口浪尖上居高不下。 Python 之所以这么受大家的青睐,是因为它语言简洁,上手容易,让非…

预测云计算的未来

云计算的未来是否依旧未知? 直到最近,云计算还是软件编程界之外很少有人熟悉的一个概念。如今,云计算已成为一切的基础,从点播电视服务和在线游戏门户网站到电子邮件和社交媒体,这四大现代世界的基石。云计算将继续存在…

在 CentOS 6.4 VPS 上安装 Git 的方法

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 简介 Git 是由 Linux 的创始人 Linus Torvalds 开发的开源分布式版本控制系统。它具有轻松的分支和合并功能,能够管理单个项…

xCat部署及分发操作系统

一、环境准备 此次安装部署均在VMware虚拟机上运行。系统采用通用稳定的centos7系统,移植到其他(linux)系统应该问题不大。软件服务器的VMware虚拟机的创建部分就跳过了. 1.1服务器的配置 IP主机名配置备注192.168.11.10master4C/8G/60GXcat/DNS/DHCP/NTP/TFTP192.168.11.11n…

Cairo库移植到安卓记录

前言 接Android Studio引入ndk编译的so库的故事,这个东西搞了两周以后,由于自己不熟悉Java和安卓开发,踩了不少坑,其中一周时间都是花在怎么用Android Studio上的。。。AS下的新版本Koala,结果网上资料全是旧版本&…