当前位置: 首页 > news >正文

通过strings二进制文件分析工具排查 version ‘GLIBC_2.25‘ not found 报错

strings命令简介

  • strings命令用于打印文件中可打印字符串, 可以打印文本文件、可执行程序,库文件等。一般用于分析可执行程序和库文件。
  • strings命令较为常用的功能有以下两种
    • 查看系统的GLIBC版本和目标文件的依赖的GLIBC版本,当系统的GLIBC版本与目标文件的依赖的GLIBC版本不匹配时,就会出现version ‘GLIBC_2.25’ not found这种报错
    • 查看某一个函数在哪个文件中

查看系统支持的GLIBC版本和目标程序依赖的GLIBC版本是否匹配

  • 背景知识
    • 在Linux平台下,GLIBC指的是GNU C Library(GNU C标准库),它是Linux操作系统中最基础、最重要的库之一。glibc是实现C语言标准库的开源版本,它为基于Linux系统的程序提供了系统调用接口,并实现了ANSI C、POSIX以及其他许多标准规定的服务。
    • GLIBC不仅包括了基本的C语言函数库如内存管理、字符串操作、数学运算等,还封装了对Linux内核服务的访问,比如文件和目录操作、进程控制、网络通信等功能。几乎所有的Linux应用程序在编译和运行时都会依赖于GLIBC。
    • libc.so.6 是 GLIBC 在Linux系统中的一个具体实现文件,提供了C语言标准库和其他系统接口功能的实际代码。
  • 可以通过以下命令来查看当前系统支持的GLIBC版本
    • strings /lib64/libc.so.6 | grep GLIBC
  • 在centos7系统执行 strings /lib64/libc.so.6 | grep GLIBC,会看到以下打印
  •   GLIBC_2.2.5GLIBC_2.2.6GLIBC_2.3GLIBC_2.3.2GLIBC_2.3.3GLIBC_2.3.4GLIBC_2.4GLIBC_2.5GLIBC_2.6GLIBC_2.7GLIBC_2.8GLIBC_2.9GLIBC_2.10GLIBC_2.11GLIBC_2.12GLIBC_2.13GLIBC_2.14GLIBC_2.15GLIBC_2.16GLIBC_2.17
    
  • 说明centos7 系统支持的最低GLIBC版本为2.2.5,支持的最高GLIBC版本为 2.17
  • ubuntu18 系统上执行 strings /lib/x86_64-linux-gnu/libc.so.6 | grep GLIBC
  •   GLIBC_2.2.5GLIBC_2.2.6GLIBC_2.3GLIBC_2.3.2GLIBC_2.3.3GLIBC_2.3.4GLIBC_2.4GLIBC_2.5GLIBC_2.6GLIBC_2.7GLIBC_2.8GLIBC_2.9GLIBC_2.10GLIBC_2.11GLIBC_2.12GLIBC_2.13GLIBC_2.14GLIBC_2.15GLIBC_2.16GLIBC_2.17GLIBC_2.18GLIBC_2.22GLIBC_2.23GLIBC_2.24GLIBC_2.25GLIBC_2.26GLIBC_2.27
    
  • 可以看到 ubuntu18 支持的最低GLIBC版本为2.2.5,支持的最高GLIBC版本为2.27
  • 在ubuntu18 上编译一个openssl库,可以看下其依赖的GLIBC版本
  • strings libcrypto.so.1.1 | grep GLIBC
  •   GLIBC_2.2.5GLIBC_2.3GLIBC_2.16GLIBC_2.7GLIBC_2.14GLIBC_2.3.2GLIBC_2.25GLIBC_2.3.4GLIBC_2.17
    
  • 可以看到libcrypto.so.1.1依赖的GLIBC版本有2.25、2.3。这些版本在centos7系统上都是不支持的
  • 如果把ubuntu18上编译的程序拿到 centos7上运行,就会出现如下报错。找不到 GLIBC_2.25 这个版本。
  •   [root@localhost er]# lslibcrypto.so.1.1  libssl.so.1.1  SSLClient[root@localhost er]# ./SSLClient./SSLClient: /lib64/libc.so.6: version `GLIBC_2.25' not found (required by ./libcrypto.so.1.1)[root@localhost er]#
    
  • 这种场景在实际中还是很常见的,如果出现这种报错,就可以使用strings命令,查看报错系统的GLIBC版本,然后再查看我们的可执行程序或依赖库,哪些依赖的GLIBC版本较高,重新在低版本系统上编译替换即可。

解决方案-重点备注

  • 出现上面这种报错,如果是自己写的程序报错,我们可以找个低版本的系统重新编译,如果是第三方库报错,找对应的源码在低版本系统上编译。
  • 我看到一些文章是通过下载高版本的GLIBC库编译后安装替换低版本的GLIBC库解决这个问题,相较于找低版本系统和编译第三方源码,这种方法确实更简单和方便。
  • 但还是不推荐这么做,因为 GLIBC库 是linux系统最基础的库,一旦我们编译替换GLIBC库的过程中出错,损坏了libc.so.6文件,那么大多数命令都将无法使用,甚至无法进入系统。如果是自己的测试机还好,要是搞坏服务器或者用户电脑的libc.so.6库,导致系统无法正常使用,后果是很严重的。
  • 我们平时也千万不要随便去删除,修改或者重命名libc.so.6这个文件,如果真的不小心损坏了,可参考以下方法去补救。
    • CentOS7救援模式修复系统丢失文件 : 虚拟机上安装的系统的补救方法。
    • 误删除libc.so.6后的修复 : 这种做法要求在删除libc.so.6之后没有关闭shell或者ssh连接的情况下紧急处理

查看函数在哪个文件中

  • 还可以使用strings命令查看某一个函数在指定目录中的哪个文件中
  •   [root@localhost er]# rm -rf src/[root@localhost er]# lslibcrypto.so.1.1  libssl.so.1.1  SSLClient[root@localhost er]# strings -f ./* | grep "SSL_write"./libssl.so.1.1: SSL_write./libssl.so.1.1: SSL_write_ex./libssl.so.1.1: SSL_write_early_data./libssl.so.1.1: SSL_write./libssl.so.1.1: SSL_write_early_data./libssl.so.1.1: SSL_write_ex./libssl.so.1.1: SSL_write_early_data./libssl.so.1.1: SSL_write_ex./libssl.so.1.1: SSL_write./SSLClient: SSL_write./SSLClient: SSL_write@@OPENSSL_1_1_0
    
  • 可以看到SSL_write函数在当前目录下的libssl.so.1.1库文件中。

相关文章:

通过strings二进制文件分析工具排查 version ‘GLIBC_2.25‘ not found 报错

strings命令简介 strings命令用于打印文件中可打印字符串, 可以打印文本文件、可执行程序,库文件等。一般用于分析可执行程序和库文件。strings命令较为常用的功能有以下两种 查看系统的GLIBC版本和目标文件的依赖的GLIBC版本,当系统的GLIBC版本与目标文…...

基于 MQTT 的开源桥接器:自由控制物联网设备 | 开源日报 No.151

Koenkk/zigbee2mqtt Stars: 10.5k License: GPL-3.0 Zigbee2MQTT 是一个 Zigbee 🐝 到 MQTT 桥接器 🌉,可以摆脱专有的 Zigbee 桥接器 🔨 允许您在不使用供应商桥接器或网关的情况下使用 Zigbee 设备通过 MQTT 桥接事件并控制 Z…...

【QT+QGIS跨平台编译】之七:【libjpeg+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、libjpeg介绍二、文件下载三、文件分析四、pro文件五、编译实践一、libjpeg介绍 libjpeg是一个广泛使用的jpeg图像压缩和解压的函数库,采用 C 语言开发。 2013年1月,Independent JPEG Group发布了版本9,对新引入的无损编码模式进行了改进。2022年1月,发布了版…...

VI / VIM的使用

vi/vim 的区别简单点来说,它们都是多模式编辑器,不同的是 vim 是 vi 的升级版本,它不仅兼容 vi 的所有指令,而且 还有一些新的特性在里面。例如语法加亮,可视化操作不仅可以在终端运行,也可以运行于 x win…...

第十二站(20天):C++泛型编程

模板 C提供了模板(template)编程的概念。所谓模板,实际上是建立一个通用函数或类, 其 类内部的类型和函数的形参类型不具体指定 ,用一个虚拟的类型来代表。这种通用的方式称 为模板。 模板是泛型编程的基础, 泛型编程即以一种独立于任何特定…...

【Docker】Dokcer学习① - 简介

【Docker】Docker学习① - 简介 一、Docker简介1. Docker是什么2. Docker组成3. Docker对比虚拟机4. Linux Namespace技术5. Linux control groups6. 容器管理工具 二、Docker安装及基础命令介绍三、Docker镜像管理四、Docker镜像与制作五、Docker数据管理六、网络部分七、Dock…...

PostgreSQL 100条命令

我会为您提供一些 PostgreSQL 中最常用的命令: 1. 创建数据库:CREATE DATABASE database_name; 2. 连接到数据库:\c database_name; 3. 创建表格:CREATE TABLE table_name (column1 datatype, column2 datatype, ...); 4. 插入数…...

HTTP动态代理的原理及其对网络性能的影响

HTTP动态代理是一种通过代理服务器来转发HTTP请求和响应数据的网络技术,它可以优化网络性能、提高网络安全性,并解决跨域请求的问题。本文将详细介绍HTTP动态代理的原理及其对网络性能的影响。 一、HTTP动态代理的原理 HTTP动态代理的基本原理是在客户…...

69.使用Go标准库compress/gzip压缩数据存入Redis避免BigKey

文章目录 一:简介二:Go标准库compress/gzip包介绍ConstantsVariablestype Headertype Reader 三:代码实践1、压缩与解压工具包2、单元测试3、为何压缩后还要用base64编码 代码地址: https://gitee.com/lymgoforIT/golang-trick/t…...

JavaScript实现的一些小案例

小案例 灯开关案例 <body><img id"light" src"img/off.jpg"><script>var light document.getElementById("light");var flag false;if(flag){light.src "img/on.jpg";flag false;}else{light.src "img/…...

MVC模式

Model-View-Controller : 模型-视图-控制器模式&#xff0c;用于应用程序的分层开发。 Model(模型)&#xff1a;代表一个存取数据的对象。也可以带有逻辑&#xff0c;在数据变化时更新控制器。 View(视图)&#xff1a;代表模型包含的数据的可视化。 Controller(控制器)&#xf…...

Java中的代理模式(一)

大家好&#x1f44b;&#xff0c;我是极客涛&#x1f60e;&#xff0c;今天我们聊一聊java中的代理模式&#xff0c;话不多说&#xff0c;还是老思路&#xff0c;什么是代理模式&#xff0c;为什么要有代理模式&#xff0c;如何实现代理模式 代理模式 在说java中的代理模式之前…...

跳跃游戏-算法

题目 给定一个数组nums {1,2,3,4,5}&#xff0c;每个元素nums[i]表示从i这个位置最多可以向前跳跃nums[i]个台阶&#xff0c;求最小需要跳几次就可以调到末尾 思路 反向查找 从末尾开始逐个向前判断最远的起跳位置&#xff0c;接着再以该位置递归的判断 public int jumpT…...

ERP系统哪个好用?用友,金蝶,ORACLE,SAP综合测评

ERP系统哪个好用&#xff1f;用友&#xff0c;金蝶&#xff0c;ORACLE&#xff0c;SAP综合测评 ERP领域SAP、ORACLE相对于国内厂商如用友、金蝶优势在哪&#xff1f; SAP&#xff0c;ORACLE操作习惯一般国人用不惯&#xff1b;相对于国产软件&#xff0c;界面也很难看&#x…...

外汇天眼:美国证券交易委员会(SEC)采纳了一系列规定,以加强与特殊目的收购公司(SPACs)相关的投资者保护

美国证券交易委员会&#xff08;SEC&#xff09;今天通过了一系列新规和修订&#xff0c;以增强特殊目的收购公司&#xff08;SPACs&#xff09;的首次公开募股&#xff08;IPOs&#xff09;中的披露&#xff0c;并在SPACs与目标公司之间的后续业务合并交易&#xff08;de-SPAC…...

kotlin map 与 flatmap

kotlin map 与 flatmap 是2个不同的概念的 map 是一种数据结构&#xff0c;flatmap 是一个高阶函数&#xff0c;处理集合用的 Map Map 是一种数据结构&#xff0c;它由一系列的键值对组成&#xff0c;每个键都是唯一的&#xff0c;并且与一个特定的值相关联。你可以通过键来…...

nginx-rtmp-module 支持 Enhancing RTMP HEVC(H.265)

Enhancing RTMP, FLV 2023年7月31号正式发布&#xff0c;主要支持了HEVC(H.265)、VP9、AV1视频编码&#xff0c;发布差不多半年了&#xff0c;很多开源项目已支持&#xff0c;最近打算播放和推送端也支持下&#xff0c;想找个支持的rtmp server方便测试用&#xff0c;但没找到合…...

2024最新JDK1.8+JDK17+JDK21安装包下载+文档

2024年更新&#xff0c;JDK8的64位和32位安装包都有&#xff0c;Java8最新文档也有&#xff0c;JDK17和JDK21的最新安装包也有 因为网上的安装包都不是最新的&#xff0c;所以自己去Oracle官网登录下载保存了一份&#xff0c;需要的朋友下面网盘链接下载 JDK8—64位安装程序&…...

如何利用chatgpt提升工作效率

chatgpt全领域小助手 项目管理&#xff1a;制定项目计划、跟踪进度、分配任务和记录里程碑。客户服务&#xff1a;回答常见问题、提供产品支持和处理客户投诉&#xff0c;提升客户满意度。销售支持&#xff1a;提供销售培训、销售脚本和客户资料&#xff0c;辅助销售团队进行销…...

WinSCP下载安装并实现远程SSH本地服务器上传文件

文章目录 1. 简介2. 软件下载安装&#xff1a;3. SSH链接服务器4. WinSCP使用公网TCP地址链接本地服务器5. WinSCP使用固定公网TCP地址访问服务器 1. 简介 ​ Winscp是一个支持SSH(Secure SHell)的可视化SCP(Secure Copy)文件传输软件&#xff0c;它的主要功能是在本地与远程计…...

从硬件迷宫到macOS殿堂:OpCore Simplify如何重塑黑苹果配置体验

从硬件迷宫到macOS殿堂&#xff1a;OpCore Simplify如何重塑黑苹果配置体验 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 对于许多技术爱好者来说&a…...

FanControl风扇控制软件:从噪音困扰到静音享受的完整指南

FanControl风扇控制软件&#xff1a;从噪音困扰到静音享受的完整指南 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending…...

ES启动失败:深入解析No buffer space available错误及连接数优化策略

1. 当ES启动失败时发生了什么 第一次看到"No buffer space available"这个报错时&#xff0c;我也是一头雾水。那天凌晨三点&#xff0c;线上监控突然报警&#xff0c;ES集群集体罢工&#xff0c;整个搜索服务直接瘫痪。查看日志发现满屏都是"java.net.SocketE…...

lite-avatar形象库入门:如何查找、预览并下载心仪的数字人形象

lite-avatar形象库入门&#xff1a;如何查找、预览并下载心仪的数字人形象 1. 数字人形象库简介 在数字人项目开发中&#xff0c;一个合适的虚拟形象往往能让用户体验大幅提升。lite-avatar形象库正是为解决这一需求而生的专业资源库。 这个基于HumanAIGC-Engineering/LiteA…...

如何突破Windows权限壁垒?系统管理专家的秘密武器

如何突破Windows权限壁垒&#xff1f;系统管理专家的秘密武器 【免费下载链接】NSudo [Deprecated, work in progress alternative: https://github.com/M2Team/NanaRun] Series of System Administration Tools 项目地址: https://gitcode.com/gh_mirrors/ns/NSudo 在W…...

汽车电子工程师必看:如何用MPC5643L实现ASIL-D级别的功能安全设计(附完整代码示例)

汽车电子工程师必看&#xff1a;如何用MPC5643L实现ASIL-D级别的功能安全设计&#xff08;附完整代码示例&#xff09; 在智能驾驶技术快速发展的今天&#xff0c;功能安全已成为汽车电子系统设计的核心考量。作为汽车电子工程师&#xff0c;我们面临的挑战不仅在于实现复杂功…...

别再手动填Token了!用Knife4j的OAuth2配置,一键搞定接口文档自动化认证

告别手动Token时代&#xff1a;Knife4j与OAuth2的自动化认证实战 每次调试API都要复制粘贴Token的日子该结束了。作为后端开发者&#xff0c;我们花了大量时间在接口文档和认证流程之间来回切换——这不仅是效率问题&#xff0c;更是一种思维中断。想象一下&#xff0c;当你的微…...

为什么你的Tinymce总是显示秘钥提示?深入解析富文本编辑器的授权机制

解密Tinymce授权机制&#xff1a;从技术原理到合规实践 每次启动项目时&#xff0c;那个突兀的"未授权"提示框是否让你感到困扰&#xff1f;作为前端开发领域的标配工具&#xff0c;Tinymce的授权机制远比表面看到的复杂。让我们拨开迷雾&#xff0c;从技术实现到商业…...

OpenClaw自动化测试:百川2-13B驱动的前端元素定位与交互验证

OpenClaw自动化测试&#xff1a;百川2-13B驱动的前端元素定位与交互验证 1. 从手工测试到智能测试的进化之路 作为一名长期奋战在前端测试一线的开发者&#xff0c;我经历过从纯手工点击到Selenium脚本&#xff0c;再到Playwright框架的技术迭代。每次升级都带来效率提升&…...

从KITTI到TUM:利用evo工具链实现轨迹真值的格式转换与可视化分析

1. 理解KITTI与TUM轨迹格式的本质差异 第一次接触SLAM评估时&#xff0c;我被各种轨迹格式搞得头晕眼花。KITTI和TUM这两种最常见的格式&#xff0c;就像两个说着不同方言的技术专家。KITTI格式简单粗暴&#xff0c;直接记录12个数字代表相机的位姿变换矩阵&#xff08;去掉最后…...