CentOS 7.9 glibc 2.17 源码编译升级到 glibc 2.31


环境

项目 值
系统 CentOS Linux release 7.9.2009
升级前 glibc 2.17
升级后 glibc 2.31
升级前 gcc 4.8.5
升级后 gcc 9.3.0
升级前 make 3.82
升级后 make 4.3
工作目录 /tmp/glibc-upgrade

1. 配置 yum 阿里源

bash 复制代码
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.back
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum clean all
yum makecache

2. 安装依赖

bash 复制代码
yum install -y python3 bison gcc-c++ glibc-devel glibc-headers texinfo

3. 升级 make 4.3

bash 复制代码
mkdir -p /tmp/glibc-upgrade && cd /tmp/glibc-upgrade
wget https://mirrors.aliyun.com/gnu/make/make-4.3.tar.gz
tar -zxf make-4.3.tar.gz
cd make-4.3
mkdir build && cd build
../configure --prefix=/usr
make -j$(nproc)
make install
make --version   # 验证: GNU Make 4.3

4. 升级 gcc 9.3.0

编译耗时约 40-60 分钟。

bash 复制代码
cd /tmp/glibc-upgrade
wget https://mirrors.aliyun.com/gnu/gcc/gcc-9.3.0/gcc-9.3.0.tar.gz
tar -zxf gcc-9.3.0.tar.gz
cd gcc-9.3.0
./contrib/download_prerequisites
mkdir build && cd build
../configure --enable-checking=release --enable-languages=c,c++ --disable-multilib --prefix=/usr/local/gcc
make -j$(nproc)
make install

配置软链接:

bash 复制代码
mv /usr/bin/gcc /usr/bin/gcc_4.8.5
ln -s /usr/local/gcc/bin/gcc /usr/bin/gcc
mv /usr/bin/g++ /usr/bin/g++_4.8.5
ln -s /usr/local/gcc/bin/g++ /usr/bin/g++
echo /usr/local/gcc/lib64 > /etc/ld.so.conf.d/gcc.conf
ldconfig
gcc -v   # 验证: gcc version 9.3.0

ldconfig 警告 /usr/local/gcc/lib64/libstdc++.so.6.0.28-gdb.py is not an ELF file 可忽略。

5. 编译安装 glibc 2.31

风险提示 :make install 会覆盖系统 /usr 下的 glibc 库。若编译失败不要 执行 make install,否则系统可能崩溃。安装成功后不要断开当前 SSH,先新开会话验证。

编译(约 20 分钟):

bash 复制代码
cd /tmp/glibc-upgrade
wget https://mirrors.aliyun.com/gnu/glibc/glibc-2.31.tar.gz
tar -zxf glibc-2.31.tar.gz
cd glibc-2.31
mkdir build && cd build
../configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin --disable-sanity-checks --disable-werror
make -j$(nproc)

备份并安装:

bash 复制代码
cp -r /usr/lib64 /usr/lib64.back
make install

make install 最后的 test-installation.pl 报 cannot find -lnss_test2 是已知问题,不影响核心库安装。

验证:

bash 复制代码
ldd --version   # 输出: ldd (GNU libc) 2.31

注意 :rpm -q glibc 仍显示 2.17 --- 源码编译不会更新 RPM 数据库,是正常的。运行时依赖实际文件,不影响功能。

屏蔽 yum glibc 更新

源码安装后,yum update 可能因文件冲突报错。需将 glibc 加入 yum 排除列表:

bash 复制代码
echo "exclude=glibc*" >> /etc/yum.conf

验证:

bash 复制代码
grep exclude /etc/yum.conf   # 输出: exclude=glibc*

6. 安装 locale(可选)

bash 复制代码
make localedata/install-locales

验证结果

bash 复制代码
ldd --version   # ldd (GNU libc) 2.31
gcc --version   # gcc (GCC) 9.3.0
g++ --version   # g++ (GCC) 9.3.0
make --version  # GNU Make 4.3

注意事项

  1. 勿断开当前 SSH。新开会话验证系统正常后再关闭。
  2. 备份 /usr/lib64.back 保留,异常时可恢复。
  3. 旧版本二进制保留:
    • gcc 旧版: /usr/bin/gcc_4.8.5
    • glibc 旧版: /lib64/libc-2.17.so
  4. 确认稳定后可清理 /tmp/glibc-upgrade/。

拓展:安装 devtoolset-11(GCC 11)

为什么需要

glibc 2.31 升级后,新版应用(如 Node.js ≥20)对新版 GCC 运行时(libstdc++.so.6、libgcc_s、libatomic)有要求:

运行时 系统默认 (glibc 升级后) 新版需要 不升级的后果
libstdc++.so.6 GLIBCXX 3.4.19 (GCC 4.8.5) ≥ GLIBCXX 3.4.21 Node 24 等无法启动
libgcc_s.so.1 GCC 4.8.5 ≥ GCC 11 异常处理与新 libstdc++ 不匹配
libatomic.so.1 ❌ 不存在 部分新代码需要 某些原生模块编译失败
方案对比
方案 优点 缺点 推荐
手动替换 libstdc++ 操作简单 只解决一个库,不配套 ❌
devtoolset-11 覆盖系统 libstdc++ 官方渠道、完整配套,同时升级 libgcc_s/libatomic 需配置 CentOS SCL 源 ✅
devtoolset-11 运行时启用 (source enable) 无需改动系统库 每个 shell 需手动启用,守护进程/服务可能找不到 开发环境可行

推荐方案:安装 devtoolset-11 并将 libstdc++.so.6 覆盖到系统路径,既保证所有进程能找到新版库,又获得完整的 GCC 工具链。

安装步骤

1. 配置 SCL 源

CentOS 7 官方源已失效,需指向 vault.archiv:

bash 复制代码
yum install -y centos-release-scl

# 替换 SCL 源为 vault.centos.org
cat > /etc/yum.repos.d/CentOS-SCLo-scl-rh.repo << 'EOF'
[centos-sclo-rh]
name=CentOS-7 - SCLo rh
baseurl=https://vault.centos.org/7.9.2009/sclo/$basearch/rh/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-SCLo
EOF

cat > /etc/yum.repos.d/CentOS-SCLo-scl.repo << 'EOF'
[centos-sclo-sclo]
name=CentOS-7 - SCLo sclo
baseurl=https://vault.centos.org/7.9.2009/sclo/$basearch/sclo/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-SCLo
EOF

yum clean all && yum makecache
2. 安装 devtoolset-11
bash 复制代码
yum install -y devtoolset-11-gcc devtoolset-11-gcc-c++
3. 获取新版 libstdc++.so.6 运行时

devtoolset-11 默认不提供独立的 libstdc++.so.6 运行时文件,需从 CentOS 8 vault 下载:

bash 复制代码
# 下载 CentOS 8 的 libstdc++ RPM
curl -sL "https://vault.centos.org/8.5.2111/BaseOS/x86_64/os/Packages/libstdc++-8.5.0-4.el8_5.x86_64.rpm" -o /tmp/libstdc++-centos8.rpm

# 提取 libstdc++.so.6.0.25
mkdir -p /tmp/rpm_extract
cd /tmp/rpm_extract
rpm2cpio /tmp/libstdc++-centos8.rpm | cpio -idm

# 覆盖到系统路径
cp /tmp/rpm_extract/usr/lib64/libstdc++.so.6.0.25 /usr/lib64/libstdc++.so.6.0.25
ln -sf libstdc++.so.6.0.25 /usr/lib64/libstdc++.so.6
ldconfig

# 验证
strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX | tail -1
# 预期输出: GLIBCXX_3.4.25

# 清理
rm -rf /tmp/rpm_extract /tmp/libstdc++-centos8.rpm

此 libstdc++.so.6.0.25 来自 RHEL 8 官方 RPM,最低需要 glibc 2.18,与已升级的 glibc 2.31 兼容。

4. 验证
bash 复制代码
# 确认 libstdc++.so.6 指向新版
ls -la /usr/lib64/libstdc++.so.6
# lrwxrwxrwx. 1 root root 19 ... libstdc++.so.6 -> libstdc++.so.6.0.25

# 确认 GLIBCXX 版本
strings /usr/lib64/libstdc++.so.6 | grep -E "^GLIBCXX_3\.4" | sort -V | tail -3
# GLIBCXX_3.4.23
# GLIBCXX_3.4.24
# GLIBCXX_3.4.25

# 测试 node 24(如已安装)
source ~/.nvm/nvm.sh && nvm use 24 && node --version
# v24.x.x

默认启用 devtoolset(可选)

将以下内容加入 ~/.bashrc,使新 shell 自动使用 GCC 11:

bash 复制代码
# devtoolset-11 (GCC 11)
[ -s "/opt/rh/devtoolset-11/enable" ] && source "/opt/rh/devtoolset-11/enable"
bash 复制代码
# 验证新 shell 自动启用
bash -l -c 'gcc --version'
# gcc (GCC) 11.2.1 20220127 (Red Hat 11.2.1-9)

启用后 gcc/g++ 指向 GCC 11,向后兼容,不影响系统已有工具。如需临时切回 4.8.5,可运行 source /opt/rh/devtoolset-11/disable。

相关推荐
Lsetea10 小时前
curl指定CA目录仍报证书不受信任:--capath与OpenSSL rehash排查
运维·https·ssl·openssl·curl
夜听莺儿鸣11 小时前
502-002_Linux驱动开发模块化编程
linux·驱动开发·模块化编程
wuminyu11 小时前
C++协程实现接收端的零拷贝Buffer管理原理剖析
java·linux·c语言·jvm·c++
优化Henry11 小时前
LTE 载波频率与频点配置详解
运维·网络·学习·5g·信息与通信
代码方舟12 小时前
数据科学风控实战:基于天远全能消金报告构建自动化信用评估网关
运维·人工智能·自动化
科力锐品牌君12 小时前
应用级灾备 | 海量非结构化数据如何实现高效数据保护
linux·运维·网络·安全·系统安全·数据安全·灾备
KaiwuDB12 小时前
KaiwuDB 运维实战04:DRBD + KaiwuDB——物联网场景下的低成本数据库高可用方案
运维·数据库·物联网·时序数据库·kaiwudb·aiot·多模数据库
zhangrelay12 小时前
ROS项目设计案例智能大模型正经乱答案例
linux·笔记·学习·ubuntu·机器人
福建佰胜张工13 小时前
A5E00839230西门子工业核心配件详解:参数、安装调试与故障运维全攻略
运维·网络·安全·自动化
流浪00113 小时前
Linux系统篇39——线程(四) pthread库的由来和线程的创建与等待
linux·操作系统·线程·pthread库