• 基于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

  • 相关阅读:
    DO280OpenShift命令及故障排查--常见故障排除和章节实验
    Linux运维相关基础知识
    论文4问O
    ITE IT66021FN/BX HDMI 1.4接收器/接收芯片/收发器
    分布式微服务 - 4.配置中心 - 2.Nacos
    Bean管理注解
    从0开始学习JavaScript--深入理解JavaScript的async/await
    Python时间模块(datetime)
    深度学习实战54-基于ChatGLM2大模型构建智能自助用药问答系统与药物智能管理实战的应用
    1.3 Linux目录操作
  • 原文地址:https://blog.csdn.net/rangfei/article/details/127719714