ubuntu20.04升级GLIBC高版本方法,解决:version `GLIBC_2.34‘ not found

检查版本

strings /lib/x86_64-linux-gnu/libc.so.6 |grep GLIBC_
1
显示结果

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_2.29
GLIBC_2.30
GLIBC_PRIVATE

最高版本只到2.30,由于使用的系统为ubuntu20.04,已经升级到了系统版本的最高版本了。

解决方案

添加一个高级版本系统的源,直接升级libc6.
Ubuntu 20.04 - added this repo as described in the link

编辑源
sudo vi /etc/apt/sources.list
1
添加高版本的源
deb http://mirrors.aliyun.com/ubuntu/ jammy main #添加该行到文件
1
运行升级
sudo apt update
sudo apt install libc6
1
2
查看结果

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
GLIBC_2.28
GLIBC_2.29
GLIBC_2.30
GLIBC_2.31 //以下为新增
GLIBC_2.32
GLIBC_2.33
GLIBC_2.34
GLIBC_2.35
GLIBC_PRIVATE

https://blog.youkuaiyun.com/huazhang_001/article/details/128828999

<think>我们正在处理的是系统级别的库glibc(GNU C Library),降级glibc是一个高风险操作,因为几乎所有系统程序都依赖于它。错误的操作可能导致系统无法启动或程序崩溃。因此,必须极其谨慎。 用户要求将glibc2.34降级到2.31。注意:glibc版本是向后兼容的,但降级可能会破坏依赖高版本glibc的程序。通常,我们不建议降级系统的glibc,而是考虑在容器中运行或使用chroot环境。 但是,如果确实需要在系统中降级glibc,可以按照以下步骤进行。注意:请确保在虚拟机或可恢复的环境中进行,并备份重要数据。 步骤概述: 1. 下载glibc 2.31源码 2. 编译安装到自定义目录(非系统目录,避免覆盖) 3. 使用环境变量(LD_LIBRARY_PATH)来使用新版本glibc(但这里是降级,所以实际上我们可能需要覆盖系统库,但强烈不推荐) 4. 或者,使用chroot或容器技术隔离环境 然而,用户明确要求降级,所以我们提供两种方案: 方案一:在自定义目录中安装glibc 2.31,并通过环境变量让特定程序使用(推荐,安全) 方案二:替换系统glibc(极其危险,不推荐) 由于引用[2]提到Ubuntu 2020默认是glibc 2.31,而用户当前是2.34(可能是Ubuntu 22.04),所以降级可能导致系统不稳定。 这里我们只提供方案一的步骤(安全方案): ### 安全方案:在自定义目录中安装glibc 2.31,并通过环境变量使用 #### 步骤1:安装编译依赖 ```bash sudo apt update sudo apt install -y build-essential bison gawk gettext python3 texinfo wget ``` #### 步骤2:下载glibc 2.31源码 ```bash wget https://ftp.gnu.org/gnu/glibc/glibc-2.31.tar.gz tar -xvf glibc-2.31.tar.gz cd glibc-2.31 ``` #### 步骤3:创建构建目录并配置 ```bash mkdir build cd build ../configure --prefix=/opt/glibc-2.31 --disable-werror ``` 注意: - `--prefix`:指定安装目录,这里我们安装到`/opt/glibc-2.31`,避免覆盖系统文件。 - `--disable-werror`:将警告不作为错误,避免编译因警告而停止。 #### 步骤4:编译与安装 ```bash make -j$(nproc) sudo make install ``` #### 步骤5:验证安装 ```bash /opt/glibc-2.31/bin/ldd --version ``` 应该输出glibc 2.31的版本信息。 #### 步骤6:使用自定义glibc运行程序 通过设置环境变量`LD_LIBRARY_PATH`来指定程序使用自定义的glibc: ```bash export LD_LIBRARY_PATH=/opt/glibc-2.31/lib:$LD_LIBRARY_PATH ``` 然后运行程序,例如: ```bash /opt/glibc-2.31/lib/ld-linux-x86-64.so.2 /path/to/your_program ``` 或者直接设置环境变量后运行(但注意,这种方式可能会因为程序使用的其他库与glibc版本不兼容而出问题): ```bash LD_LIBRARY_PATH=/opt/glibc-2.31/lib /path/to/your_program ``` ### 警告 1. 不要覆盖系统的glibc,否则可能导致系统崩溃。 2. 使用自定义glibc运行程序时,必须确保程序所依赖的其他库与glibc 2.31兼容。 ### 相关问题 1. 如何检查程序依赖的glibc版本2. 使用自定义glibc运行程序时出现“未找到符号”错误如何解决? 3. 如何创建一个使用特定glibc版本的chroot环境? 4. 在容器中运行旧版glibc程序的最佳实践是什么? 5. 如何卸载自定义安装的glibc? ### 引用说明 在引用[1]中,我们看到了检查glibc版本方法,引用[2]则提到了不同Ubuntu版本默认的glibc版本以及升级方法(但我们是降级,所以不推荐直接升级系统glibc)。引用[3][4]是关于glibc内部函数实现的,与当前需求无关。 因此,我们按照安全的方式提供降级使用的方法,而不影响系统全局。 注意:如果用户确实需要全局降级(替换系统glibc),那么风险极高,通常需要重新编译所有依赖glibc的软件包(包括gcc、bash等基础工具),这几乎等同于重新安装一个旧版本的系统。因此,强烈建议使用容器技术(如Docker)或虚拟机来运行需要旧版glibc的程序。 如果用户坚持要替换系统glibc,请务必在可恢复的环境(如虚拟机)中进行,并准备好系统恢复方案。由于风险极高,此处不提供详细步骤。</think>### 🔧 GLibc 2.34 降级到 2.31 的完整指南 > ⚠️ **重要警告** > GLibcLinux 系统的核心库,降级操作极其危险,可能导致: > - 系统无法启动 > - 关键程序崩溃(如 apt、bash) > - 依赖高版本 GLibc 的软件失效 > **强烈建议在虚拟机或可恢复环境中操作!** #### 一、安全准备(必须步骤) ```bash # 1. 创建系统快照 sudo timeshift --create --comments "Pre-glibc-downgrade" # 2. 备份关键库 sudo cp -a /lib/x86_64-linux-gnu /lib/x86_64-linux-gnu.bak sudo cp -a /usr/lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu.bak # 3. 进入恢复终端 (tty) sudo systemctl isolate multi-user.target ``` #### 二、下载并编译 GLibc 2.31 ```bash # 1. 安装编译依赖 sudo apt update sudo apt install -y build-essential bison gawk gettext python3 texinfo # 2. 下载源码 wget https://ftp.gnu.org/gnu/glibc/glibc-2.31.tar.gz tar -xvf glibc-2.31.tar.gz cd glibc-2.31 # 3. 创建独立构建目录 mkdir build && cd build # 4. 配置编译选项 (关键!) ../configure \ --prefix=/usr \ # 系统路径 --disable-werror \ # 忽略警告 --enable-add-ons \ # 附加模块 --enable-stack-protector=strong \ --with-headers=/usr/include \ # 使用系统头文件 libc_cv_slibdir=/lib/x86_64-linux-gnu # 5. 编译安装 (禁用并行) make -j1 # 单线程避免错误 sudo make install ``` #### 三、验证降级 ```bash # 检查当前版本 ldd --version # 验证符号版本 (应显示 GLIBC_2.31) strings /lib/x86_64-linux-gnu/libc.so.6 | grep GLIBC ``` #### 四、故障恢复方案 **如果系统无法启动:** 1. 使用 Live USB 启动 2. 挂载原系统分区: ```bash sudo mount /dev/sdaX /mnt sudo mount --bind /dev /mnt/dev sudo chroot /mnt ``` 3. 恢复备份: ```bash cp -a /lib/x86_64-linux-gnu.bak/* /lib/x86_64-linux-gnu/ cp -a /usr/lib/x86_64-linux-gnu.bak/* /usr/lib/x86_64-linux-gnu/ ldconfig ``` #### 五、替代安全方案(推荐) ```bash # 使用容器运行旧版环境 sudo apt install podman podman run -it ubuntu:20.04 # 内置 glibc 2.31 # 或使用 chroot 环境 debootstrap --arch=amd64 focal /opt/old_ubuntu http://archive.ubuntu.com/ubuntu chroot /opt/old_ubuntu ``` ### ⚠️ 关键注意事项 1. **符号兼容性** GLibc 通过符号版本控制(如 `GLIBC_2.34`)保持兼容性[^1]。降级后依赖高版本符号的程序将崩溃: ```bash objdump -T /bin/bash | grep GLIBC_ # 检查程序依赖 ``` 2. **ABI 风险** 2.31 → 2.34 存在 ABI 变更: - 线程本地存储实现变更 - malloc 行为调整 - 时间处理函数更新 3. **安全补丁回退** 2.31 缺少 2.34 的关键修复: ```diff - CVE-2021-3998:本地提权漏洞 - CVE-2022-23218:缓冲区溢出 ``` ### 📚 相关问题 1. 如何检查应用程序依赖的 GLibc 最小版本2. 降级后如何修复 `FATAL: kernel too old` 错误? 3. 使用旧版 GLibc 时如何保证系统安全? 4. 如何为特定程序创建 GLibc 兼容层? 5. 系统降级 GLibc 后如何恢复包管理器(apt)功能? 6. 哪些 Linux 发行版默认使用 GLibc 2.31? 7. 如何交叉编译依赖旧版 GLibc 的软件? > **调试提示**:使用 `LD_DEBUG` 监控库加载: > ```bash > LD_DEBUG=libs ldd --version # 显示库加载过程 > LD_DEBUG=symbols ldd --version # 跟踪符号解析 > ```[^1][^2]
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值