在一个 CentOS Stream8 上安装或运行某些程序时,报 `GLIBC_2.29' not found,因为系统自带的 glibc 库版本只到 glibc-2.28。
$ strings /usr/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
GLIBC_2.18
GLIBC_2.22
GLIBC_2.23
GLIBC_2.24
GLIBC_2.25
GLIBC_2.26
GLIBC_2.27
GLIBC_2.28
GLIBC_PRIVATE
GA+GLIBCXX_ASSERTIONS
GA+GLIBCXX_ASSERTIONS
GA+GLIBCXX_ASSERTIONS
...
对于在较高版本上编译的程序就需要更高版本的 glibc。所以这里尝试更新系统的 glibc。
注:这里记录的两个方法虽然最后能成功更新 glibc,但是对系统有很大的影响,谨慎使用。
wget https://ftp.gnu.org/gnu/libc/glibc-2.34.tar.gz
tar xvf glibc-2.34.tar.gz
glic 的编译不能在自身目录下进行,这样方便将所有生成的文件集中放置,出现问题时只要删除编译目录即可,源代码目录仍保留完整的源代码。(但编译过程还是会修改部分内容。)
cd glibc-2.34
mkdir build && cd build
../configure --prefix=/usr/local/glibc-2.34
configure 文件有多个参数可以添加,但只有 --prefix 是必需的,它表示后续在哪个目录下安装 glibc,默认是 "/usr/local",我这里选择 "/usr/local/glibc-2.34"。
make -j 64
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 的 rpm 包。包的下载链接为:rpm2html/rpmfind
因为我使用的 CentOS Stream8,在更新时还是谨慎一点选择 CentOS Stream 9 AppStream for x86_64 对应的包。
仅仅安装 glibc 和 glibc-devel 无法成功,因为涉及大量的依赖包。最后我下载的内容如下:
即使如此,还是没能满足所有的依赖需求,最后还是强制安装。
sudo rpm -ivh libgcc*.rpm --force
sudo rpm -ivh libxcrypt*.rpm --force
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