当前位置: 首页 > 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库文件中。
http://www.lryc.cn/news/287524.html

相关文章:

  • 基于 MQTT 的开源桥接器:自由控制物联网设备 | 开源日报 No.151
  • 【QT+QGIS跨平台编译】之七:【libjpeg+Qt跨平台编译】(一套代码、一套框架,跨平台编译)
  • VI / VIM的使用
  • 第十二站(20天):C++泛型编程
  • 【Docker】Dokcer学习① - 简介
  • PostgreSQL 100条命令
  • HTTP动态代理的原理及其对网络性能的影响
  • 69.使用Go标准库compress/gzip压缩数据存入Redis避免BigKey
  • JavaScript实现的一些小案例
  • MVC模式
  • Java中的代理模式(一)
  • 跳跃游戏-算法
  • ERP系统哪个好用?用友,金蝶,ORACLE,SAP综合测评
  • 外汇天眼:美国证券交易委员会(SEC)采纳了一系列规定,以加强与特殊目的收购公司(SPACs)相关的投资者保护
  • kotlin map 与 flatmap
  • nginx-rtmp-module 支持 Enhancing RTMP HEVC(H.265)
  • 2024最新JDK1.8+JDK17+JDK21安装包下载+文档
  • 如何利用chatgpt提升工作效率
  • WinSCP下载安装并实现远程SSH本地服务器上传文件
  • QEMU搭建arm虚拟机开发环境
  • web 应用常见的安全问题
  • 502. IPO
  • 如何安装MeterSphere并实现无公网ip远程访问服务管理界面
  • 做FP独立站怎么引流?这个引流法宝收好了!
  • 幻兽帕鲁PalWorld服务器搭建教程,1分钟开服,纯小白教程,无需基础
  • 算法小抄01
  • Spring Boot 集成 API 文档 - Swagger、Knife4J、Smart-Doc
  • 2024年软考报名时间及条件,小白必看
  • vue 跨域XMLHttpRequest
  • 【正点原子STM32】STM32基础知识(F1F4F7H7 STM32系统框架、寻址范围、存储器映射的存储器功能划分、寄存器映射)