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

本文介绍了strings命令在Linux系统中用于查看GLIBC版本以及检查程序依赖的GLIBC版本,展示了如何解决因版本不匹配导致的报错,并强调了避免直接替换GLIBC库以防止系统稳定性风险。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.5
      GLIBC_2.2.6
      GLIBC_2.3
      GLIBC_2.3.2
      GLIBC_2.3.3
      GLIBC_2.3.4
      GLIBC_2.4
      GLIBC_2.5
      GLIBC_2.6
      GLIBC_2.7
      GLIBC_2.8
      GLIBC_2.9
      GLIBC_2.10
      GLIBC_2.11
      GLIBC_2.12
      GLIBC_2.13
      GLIBC_2.14
      GLIBC_2.15
      GLIBC_2.16
      GLIBC_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.5
      GLIBC_2.2.6
      GLIBC_2.3
      GLIBC_2.3.2
      GLIBC_2.3.3
      GLIBC_2.3.4
      GLIBC_2.4
      GLIBC_2.5
      GLIBC_2.6
      GLIBC_2.7
      GLIBC_2.8
      GLIBC_2.9
      GLIBC_2.10
      GLIBC_2.11
      GLIBC_2.12
      GLIBC_2.13
      GLIBC_2.14
      GLIBC_2.15
      GLIBC_2.16
      GLIBC_2.17
      GLIBC_2.18
      GLIBC_2.22
      GLIBC_2.23
      GLIBC_2.24
      GLIBC_2.25
      GLIBC_2.26
      GLIBC_2.27
    
  • 可以看到 ubuntu18 支持的最低GLIBC版本为2.2.5,支持的最高GLIBC版本为2.27
  • 在ubuntu18 上编译一个openssl库,可以看下其依赖的GLIBC版本
  • strings libcrypto.so.1.1 | grep GLIBC
  •   GLIBC_2.2.5
      GLIBC_2.3
      GLIBC_2.16
      GLIBC_2.7
      GLIBC_2.14
      GLIBC_2.3.2
      GLIBC_2.25
      GLIBC_2.3.4
      GLIBC_2.17
    
  • 可以看到libcrypto.so.1.1依赖的GLIBC版本有2.25、2.3。这些版本在centos7系统上都是不支持的
  • 如果把ubuntu18上编译的程序拿到 centos7上运行,就会出现如下报错。找不到 GLIBC_2.25 这个版本。
  •   [root@localhost er]# ls
      libcrypto.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这个文件,如果真的不小心损坏了,可参考以下方法去补救。

查看函数在哪个文件中

  • 还可以使用strings命令查看某一个函数在指定目录中的哪个文件中
  •   [root@localhost er]# rm -rf src/
      [root@localhost er]# ls
      libcrypto.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库文件中。
<think>我们正在处理的是在CentOS 7.5上遇到的libpq.so.5依赖问题,具体错误是“libpq.so.5 requires GLIBC_2.25 not found in /lib64/libc.so.6”。这是因为CentOS 7.5自带的glibc版本(通常是2.17)低于所需的2.25。 解决方案有两种: 1. 升级整个系统的glibc(不推荐,因为glibc是核心库,升级可能导致系统不稳定) 2. 使用高版本glibc编译libpq,然后通过设置环境变量LD_LIBRARY_PATH来使用(推荐) 这里我们选择第二种方法,即编译高版本的glibc(例如2.25或更高)并在非系统目录安装,然后重新编译libpq(或者直接使用预编译的libpq,但需要确保链接到我们编译的glibc)。但是,由于用户的问题是关于libpq.so.5的,我们也可以考虑直接编译一个静态链接的libpq,或者使用容器技术(如Docker)来避免系统库升级。 然而,考虑到用户可能希望直接在CentOS7.5上运行,我们采用编译新版glibc并局部使用的方法。 步骤概述: 1. 下载并编译安装glibc 2.25(或更高版本)到自定义目录(例如/opt/glibc-2.252. 下载并编译libpq(我们选择对应版本,例如PostgreSQL 10,因为libpq.so.5通常对应PostgreSQL 10及以下版本)并链接到我们编译的glibc 3. 设置环境变量LD_LIBRARY_PATH,让应用程序能够找到我们编译的glibc和libpq 注意:由于glibc的编译非常耗时且容易出错,务必严格按照步骤操作。 详细步骤: ### 步骤1:安装编译依赖 ```bash sudo yum groupinstall "Development Tools" -y sudo yum install -y gcc make bison perl wget texinfo ``` ### 步骤2:下载并编译glibc 2.25 ```bash # 创建编译目录 mkdir ~/glibc-build cd ~/glibc-build # 下载glibc 2.25(注意:glibc 2.25需要配合内核版本,CentOS7.5内核版本为3.10,是支持的) wget http://ftp.gnu.org/gnu/glibc/glibc-2.25.tar.gz tar xvf glibc-2.25.tar.gz mkdir build cd build # 配置(安装到/opt/glibc-2.25../glibc-2.25/configure --prefix=/opt/glibc-2.25 --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin # 编译(使用多核编译,根据CPU核心数调整) make -j$(nproc) # 安装 sudo make install ``` ### 步骤3:下载并编译libpq 这里我们选择PostgreSQL 10版本(因为libpq.so.5在PostgreSQL 10中提供): ```bash # 下载PostgreSQL 10源码 cd ~ wget https://ftp.postgresql.org/pub/source/v10.23/postgresql-10.23.tar.gz tar xvf postgresql-10.23.tar.gz cd postgresql-10.23 # 配置,指定使用我们编译的glibc # 注意:设置CC环境变量使用我们编译的glibc中的gcc?实际上我们通过设置编译时的链接路径来指定 # 另一种方法:设置环境变量LD_LIBRARY_PATH和PATH,然后编译 # 这里我们使用rpath来指定运行时库路径 # 首先设置编译时使用的链接器路径 export PATH=/opt/glibc-2.25/bin:$PATH export LD_LIBRARY_PATH=/opt/glibc-2.25/lib # 配置PostgreSQL,只编译libpq ./configure --without-readline --without-zlib --prefix=/opt/postgresql10 cd src/interfaces/libpq make sudo make install ``` ### 步骤4:配置环境变量 将编译好的libpq.so.5(位于/opt/postgresql10/lib)和glibc的库(/opt/glibc-2.25/lib)添加到LD_LIBRARY_PATH: ```bash # 临时生效 export LD_LIBRARY_PATH=/opt/postgresql10/lib:/opt/glibc-2.25/lib:$LD_LIBRARY_PATH # 永久生效(写入~/.bashrc或/etc/profile) echo 'export LD_LIBRARY_PATH=/opt/postgresql10/lib:/opt/glibc-2.25/lib:$LD_LIBRARY_PATH' | sudo tee -a /etc/profile.d/custom_lib.sh source /etc/profile.d/custom_lib.sh ``` ### 步骤5:验证 ```bash # 检查libpq依赖的glibc版本 ldd /opt/postgresql10/lib/libpq.so.5 | grep libc.so.6 # 应该显示指向/opt/glibc-2.25/lib/libc.so.6 # 运行需要libpq.so.5的程序,应该不再报错 ``` ### 替代方案:使用静态链接的libpq 如果你不想处理动态库依赖,可以编译静态版本的libpq,然后链接到你的应用程序。在编译应用程序时,使用静态库(libpq.a)并确保链接所有依赖库。 ### 注意事项 1. 编译glibc和libpq需要较长时间。 2. 不要替换系统的glibc,否则可能导致系统崩溃。 3. 如果应用程序通过包管理器安装,可能需要卸载并重新从源码编译以链接到新的libpq。 ### 相关问题 1. 如何检查系统中已安装的glibc版本?[^1] 2. 除了升级glibc,还有哪些方法解决库依赖问题?[^2] 3. 如何为特定应用程序设置LD_LIBRARY_PATH?[^3] 4. 静态链接和动态链接有什么区别?[^4] 5. 如何在CentOS 7上使用Docker运行需要高版本glibc的应用?[^5] [^1]: 使用命令`ldd --version`可以查看系统glibc版本。 [^2]: 可以使用容器技术(如Docker)、静态编译应用程序、或者使用Linux的命名空间隔离技术(如chroot)来创建独立环境。 [^3]: 可以在应用程序的启动脚本中设置LD_LIBRARY_PATH,例如:`export LD_LIBRARY_PATH=/path/to/libs; ./myapp`。 [^4]: 静态链接将库代码直接包含在可执行文件中,而动态链接则在运行时加载共享库。静态链接生成的文件较大,但部署简单;动态链接节省内存,但需要环境中有正确的库版本。 [^5]: 可以编写Dockerfile,基于高版本glibc的基础镜像(如ubuntu:20.04)构建应用镜像,然后运行容器。</think>### 解决 CentOS 7.5 的 `libpq.so.5 requires GLIBC_2.25` 错误 #### 🔍 问题原因 CentOS 7.5 默认安装的 GLIBC 版本是 2.17(可通过 `ldd --version` 验证),而 `libpq.so.5` 需要 GLIBC_2.25+。这是 PostgreSQL 客户端库的常见依赖冲突[^1][^2]。 #### ✅ 推荐解决方案:安装兼容的 PostgreSQL 客户端 ```bash # 添加 PostgreSQL 官方仓库 sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm # 安装兼容的 libpq sudo yum install -y postgresql10-libs # 验证安装 ls -l /usr/pgsql-10/lib/libpq.so.5 ldd /usr/pgsql-10/lib/libpq.so.5 | grep libc.so.6 ``` #### ⚠️ 替代方案:手动编译高版本 GLIBC(高风险) ```bash # 安装编译依赖 sudo yum install -y gcc make bison perl wget # 下载 GLIBC 2.25 wget http://ftp.gnu.org/gnu/glibc/glibc-2.25.tar.gz tar xvf glibc-2.25.tar.gz mkdir glibc-build cd glibc-build # 配置安装路径(非系统目录) ../glibc-2.25/configure --prefix=/opt/glibc-2.25 # 编译安装 make -j$(nproc) sudo make install # 设置环境变量 echo 'export LD_LIBRARY_PATH=/opt/glibc-2.25/lib:$LD_LIBRARY_PATH' | sudo tee /etc/profile.d/glibc_custom.sh source /etc/profile.d/glibc_custom.sh ``` #### 📍 验证修复 ```bash # 检查 GLIBC 版本 strings /lib64/libc.so.6 | grep ^GLIBC # 测试 libpq 依赖 LD_LIBRARY_PATH=/opt/glibc-2.25/lib ldd /path/to/libpq.so.5 ``` #### ⚠️ 重要警告 1. **不要替换系统 GLIBC**:直接升级系统 GLIBC 会导致系统崩溃(yum/rpm 等工具依赖特定版本)[^1] 2. 优先使用 `postgresql10-libs` 方案,更安全稳定 3. 若使用自定义 GLIBC,所有依赖程序需通过 `LD_LIBRARY_PATH` 指定路径 #### 💡 最佳实践 ```bash # 在应用启动脚本中添加 export LD_LIBRARY_PATH=/opt/glibc-2.25/lib:/usr/pgsql-10/lib:$LD_LIBRARY_PATH ./your_application ``` #### 📚 相关问题 1. 如何安全升级 CentOS 7 的 GLIBC 版本?[^1] 2. PostgreSQL 不同版本与 GLIBC 的兼容性对照?[^2] 3. 使用 Docker 容器是否比手动编译 GLIBC安全?[^1] 4. 如何检查应用程序的 GLIBC 依赖?[^1] 5. 当无法安装高版本 GLIBC 时,如何降级 PostgreSQL 客户端?[^2] [^1]: 引用自 GLIBC 兼容性说明 [^2]: 参考 PostgreSQL 官方文档版本兼容性指南
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大草原的小灰灰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值