• 基于CentOS更新 glibc - 解决 `GLIBC_2.29‘ not found


    说明

    在一个 CentOS Stream8 上安装或运行某些程序时,报 `GLIBC_2.29' not found,因为系统自带的 glibc 库版本只到 glibc-2.28。

    1. $ strings /usr/lib64/libc.so.6 | grep GLIBC
    2. GLIBC_2.2.5
    3. GLIBC_2.2.6
    4. GLIBC_2.3
    5. GLIBC_2.3.2
    6. GLIBC_2.3.3
    7. GLIBC_2.3.4
    8. GLIBC_2.4
    9. GLIBC_2.5
    10. GLIBC_2.6
    11. GLIBC_2.7
    12. GLIBC_2.8
    13. GLIBC_2.9
    14. GLIBC_2.10
    15. GLIBC_2.11
    16. GLIBC_2.12
    17. GLIBC_2.13
    18. GLIBC_2.14
    19. GLIBC_2.15
    20. GLIBC_2.16
    21. GLIBC_2.17
    22. GLIBC_2.18
    23. GLIBC_2.22
    24. GLIBC_2.23
    25. GLIBC_2.24
    26. GLIBC_2.25
    27. GLIBC_2.26
    28. GLIBC_2.27
    29. GLIBC_2.28
    30. GLIBC_PRIVATE
    31. GA+GLIBCXX_ASSERTIONS
    32. GA+GLIBCXX_ASSERTIONS
    33. GA+GLIBCXX_ASSERTIONS
    34. ...

    对于在较高版本上编译的程序就需要更高版本的 glibc。所以这里尝试更新系统的 glibc。

    注:这里记录的两个方法虽然最后能成功更新 glibc,但是对系统有很大的影响,谨慎使用。

    源代码安装 glibc

    下载源代码

    1. wget https://ftp.gnu.org/gnu/libc/glibc-2.34.tar.gz
    2. tar xvf glibc-2.34.tar.gz

    配置环境

     glic 的编译不能在自身目录下进行,这样方便将所有生成的文件集中放置,出现问题时只要删除编译目录即可,源代码目录仍保留完整的源代码。(但编译过程还是会修改部分内容。)

    1. cd glibc-2.34
    2. mkdir build && cd build
    3. ../configure --prefix=/usr/local/glibc-2.34

     configure 文件有多个参数可以添加,但只有 --prefix 是必需的,它表示后续在哪个目录下安装 glibc,默认是 "/usr/local",我这里选择 "/usr/local/glibc-2.34"。

    编译安装

    1. make -j 64
    2. make install

    此时会在 /usr/local 目录下生成一个 glibc-2.34 目录,包含所有的 bin/lib/include 文件。其中 lib 目录下就有我们需要的 libc.so.6 和 libm.so.6。

    导入路径

    上面的操作只是生成和安装,但没有添加到环境变量中去,所以其他软件仍然找不到这些依赖文件。

    由于 libc 是系统基础文件,不能轻易删除,所以这里选择将新生成的文件路径直接导入环境变量,而不是替换原有文件。但是需要注意的是绝对不能导入到系统环境变量,如 /etc/profile 等,否则系统所有命令都会出现 "Segmentation fault"。

    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/glibc-2.34/lib

    安装包更新 glibc

     

    在使用源代码无法更新的情况下,我继续尝试直接安装更新 glibc 的 rpm 包。包的下载链接为:rpm2html/rpmfind

    因为我使用的 CentOS Stream8,在更新时还是谨慎一点选择 CentOS Stream 9 AppStream for x86_64 对应的包。

    仅仅安装 glibc 和 glibc-devel 无法成功,因为涉及大量的依赖包。最后我下载的内容如下:

     即使如此,还是没能满足所有的依赖需求,最后还是强制安装。

    1. sudo rpm -ivh libgcc*.rpm --force
    2. sudo rpm -ivh libxcrypt*.rpm --force
    3. sudo rpm -ivh glibc*.rpm --force

    最后系统中将存在两个 glibc 库版本,能够使我正常运行要求高版本 GLIBC 的程序。当我以为一切大功告成时,安装新软件又出现问题,使用 dnf install ... 会出现依赖的不满足的情况,所以实际上还是没能解决问题。

    总结 

    前面使用源代码安装参考了 GNU C 的官方文档,文档的描述很详细,但是没有说明更新后不能使用的情况。使用 rpm 包很考验耐心,最后还是会因为包之间相互依赖而导致问题,真的很烦。

    所以这篇文档的方法最后并没能完美解决问题,纯当记录,如果有人知道其他解决方案,请告知,万分感谢!

    参考资料

    《The GNU C Library Reference Manual》

    package management - Cannot update glibc on CentOS 7 - Unix & Linux Stack Exchange

    centos7 - safely upgrade glibc on CentOS 7 - Server Fault

  • 相关阅读:
    基于Vertx实现可配置及可扩展的IOT服务
    【ADB】蓝牙总结
    typescript笔记
    企业微信群发助手:加速信息传递,强化营销效果的新引擎
    融合关键点属性与注意力表征的人脸表情识别--2021.高红霞
    掉了两根头发后,我悟了!vue3的scoped原来是这样避免样式污染(上)
    IronPDF for Java 2023.9.2 Crack
    [刷题]队列
    linux 测试
    Android 音频可视化
  • 原文地址:https://blog.csdn.net/rangfei/article/details/127719714