【日常记录】解决‘GLIBC_2.34‘ not found,并且gcc制定glibc版本编译

小荣的日常记录


🔥系列专栏:日常记录
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
📆首发时间:🌴2022年11月21日🌴
🍭作者水平很有限,如果发现错误,还望告知,感谢!


发生了什么

当我兴致勃勃的准备内核提权时,发现glibc版本不对
在这里插入图片描述

真让人生气

第一步,查看靶场glibc版本

ldd --version

在这里插入图片描述

第二步,配置all in one环境

下载glibc-all-in-one

proxychains4 -f /etc/proxychains4.conf git clone https://github.com/matrix1001/glibc-all-in-one.git

在这里插入图片描述
更新列表

cd glibc-all-in-one/
python3 update_list

在这里插入图片描述
看看能安装啥

cat list

只截取了一部分

在这里插入图片描述

第三步,安装配置patchelf

照抄,没有原因

git clone https://github.com/NixOS/patchelf.git
cd patchelf
./bootstrap.sh 
./configure
make
make check
sudo make install

在这里插入图片描述这样的结尾说明一切正常

下载配置特定版本glibc

cat  list
我们这个靶场需要642.28
没有2.28
下个低一个版本的
./download 2.27-3ubuntu1_amd64

在这里插入图片描述

编译

核心,精华
编译方式

gcc -Wl,-rpath='/root/glibc-all-in-one/libs/2.27-3ubuntu1_amd64',-dynamic-linker='/root/glibc-all-in-one/libs/2.27-3ubuntu1_amd64/ld-linux-x86-64.so.2' -s 1.c -o haha

注意这一段,要求是绝对路径
/root/glibc-all-in-one/libs/2.27-3ubuntu1_amd64这个路径和下面这个应该不用说了,注意是ld-linux-x86-64.so.2文件,对应下一个参数
/root/glibc-all-in-one/libs/2.27-3ubuntu1_amd64/ld-linux-x86-64.so.2
剩下的参数和正常的一样

-Wl,-rpath='/root/glibc-all-in-one/libs/2.27-3ubuntu1_amd64',-dynamic-linker='/root/glibc-all-in-one/libs/2.27-3ubuntu1_amd64/ld-linux-x86-64.so.2'

如果需要其他版本的glibc也可以
不过我还没弄好,但是已经可以正常执行了,不会报错了
在这里插入图片描述
应该是sh的调用问题
不过环境已经好了
还有一种简单的方法就是
直接安装一个2018年的kali
什么都解决了
不会有任何问题

<think>我们面临的问题是在Linux系统中运行程序时出现GLIBC版本不匹配的错误,例如: - `GLIBC_2.28 not found` - `GLIBC_2.34 not found` 这些错误是因为程序在较高版本glibc环境下编译(例如Ubuntu 20.04以上),而在较低版本glibc系统(例如Ubuntu 18.04)上运行导致的。 注意:glibcLinux系统的核心库,直接升级系统glibc版本风险较大,可能导致系统不稳定甚至崩溃。因此,我们需要谨慎选择解决方案。 根据引用[1][2][3][4][5],我们可以总结出以下几种解决方法: ### 方法1:在目标系统上更新glibc(不推荐,风险高) 适用于可以接受系统升级且目标系统允许升级glibc的情况。但请注意,升级glibc可能会影响系统中其他依赖老版本glibc的软件。 步骤(以Ubuntu为例): 1. 编辑`/etc/apt/sources.list`,添加高版本glibc的源(如Ubuntu 22.04的源): ```bash sudo echo "deb http://mirrors.aliyun.com/ubuntu/ jammy main" >> /etc/apt/sources.list ``` 2. 更新并安装: ```bash sudo apt update sudo apt install libc6 ``` 在安装过程中,可能会提示是否自动重启服务,选择“No”以避免自动重启服务(引用[2])。 3. 修复依赖关系: ```bash sudo apt --fix-broken install ``` 4. 更新动态链接器缓存: ```bash sudo ldconfig ``` 5. 验证版本: ```bash ldd --version ``` 注意:这种方法可能导致系统不稳定,特别是当系统中其他软件依赖旧版本glibc时。因此,生产环境不推荐。 ### 方法2:在目标系统上重新编译程序(推荐) 如果程序源代码可用,最安全的方法是在目标系统上重新编译程序,这样编译出的程序将使用目标系统上的glibc版本。 步骤: 1. 在目标系统上安装编译所需的依赖(包括gcc、make等)。 2. 获取程序源代码。 3. 编译并安装: ```bash ./configure make sudo make install ``` 如果程序是Python包(如引用[3]中提到的pyarrow),则重新安装该包即可: ```bash pip uninstall pyarrow pip install pyarrow ``` ### 方法3:使用静态链接编译程序(适用于程序开发者) 如果我们是程序的开发者,可以在编译程序时使用静态链接,将glibc的依赖静态编译到可执行文件中。这样程序就不依赖系统的glibc动态库了。 使用gcc静态编译: ```bash gcc -static your_program.c -o your_program ``` 注意:静态编译会使程序体积变大,且可能无法使用动态链接库的一些特性。 ### 方法4:使用高版本glibc的库文件替换(风险高,不推荐) 引用[4]中提到的方法:将高版本glibc的库文件(如`libc.so.6`)和链接器(如`ld-linux-aarch64.so.1`)复制到目标系统的某个目录(例如`/lib64`),然后设置环境变量`LD_LIBRARY_PATH`或修改程序的链接器路径(使用`patchelf`工具)。这种方法风险极高,容易导致系统崩溃,仅作为最后手段。 步骤(以aarch64平台为例): 1. 从高版本系统复制glibc库文件(例如`libc.so.6`和`ld-linux-aarch64.so.1`)到目标系统的目录(例如`/lib64`)。 2. 设置环境变量(临时): ```bash export LD_LIBRARY_PATH=/lib64:$LD_LIBRARY_PATH ``` 3. 或者使用`patchelf`修改程序的链接器路径(需要先安装`patchelf`): ```bash patchelf --set-interpreter /lib64/ld-linux-aarch64.so.1 your_program ``` 警告:此方法可能导致程序运行异常或系统不稳定,请谨慎使用。 ### 方法5:使用容器或虚拟机(推荐) 如果目标系统无法升级glibc,且重新编译不可行,可以考虑使用容器(如Docker)或虚拟机来运行程序。在容器中运行高版本glibc的系统镜像,然后运行程序。 步骤(以Docker为例): 1. 安装Docker。 2. 拉取一个高版本glibc的基础镜像(如Ubuntu 20.04): ```bash docker pull ubuntu:20.04 ``` 3. 将程序放入容器中运行: ```bash docker run -v /path/to/your/program:/app -it ubuntu:20.04 /app/your_program ``` ### 方法6:使用AppImage或Flatpak打包(适用于应用程序分发) 如果程序需要分发,可以考虑使用AppImage或Flatpak等打包方式,这些方式会将程序及其依赖(包括glibc)打包在一起,从而避免对目标系统glibc版本的依赖。 ### 总结建议 - 如果条件允许,**重新编译程序**(方法2)是最安全、最推荐的方式。 - 如果程序是开发者自己控制的,考虑**静态链接**(方法3)或使用**容器技术**(方法5)。 - 避免直接升级生产系统的glibc(方法1)或替换系统库文件(方法4),除非你非常清楚风险并能够承担后果。 §§相关问题§§ 1. 如何安全地升级Linux系统的glibc2. 如何使用Docker容器运行依赖高版本glibc的程序? 3. 如何静态编译Linux程序以避免glibc依赖问题? 4. 如何使用patchelf工具修改程序的动态链接器路径?</think>### 解决 Linux glibc 版本不匹配导致的依赖库错误 当程序在 Linux 系统运行时提示 `GLIBC_2.34 not found` 或类似错误,表示程序依赖的 glibc 版本高于系统当前版本。以下是 5 种解决方案,按推荐优先级排序: --- #### **方案 1:重新编译程序(最安全推荐)** [^3] ```bash # 1. 卸载高版本编译的软件包 pip uninstall 报错的包名 # 如 pyarrow # 2. 在目标系统上重新编译安装 pip install 包名==指定版本号 -i 镜像源 ``` **适用场景**:Python 包(如 pyarrow)、开源程序 **优点**:完全兼容系统环境,无破坏性 **注意**:需确认程序支持当前系统的编译版本 --- #### **方案 2:使用容器化运行(生产环境推荐)** ```bash # 创建 Dockerfile FROM ubuntu:22.04 # 选择包含所需glibc的镜像 COPY gateway /app CMD ["/app/gateway"] # 构建并运行 docker build -t gateway-app . docker run -d gateway-app ``` **优点**: - 完全隔离环境 - 不修改宿主机系统库 - 支持跨版本运行(Ubuntu 18.04 跑 Ubuntu 22.04 程序) --- #### **方案 3:安全升级 glibc(谨慎操作)** [^2][^5] ```bash # 1. 添加阿里云镜像源 echo "deb http://mirrors.aliyun.com/ubuntu/ jammy main" | sudo tee -a /etc/apt/sources.list # 2. 更新安装(Ubuntu 示例) sudo apt update sudo apt install libc6 -y # 3. 修复依赖关系 sudo apt --fix-broken install sudo ldconfig # 4. 验证版本 ldd --version ``` **注意**: - 仅适用于相同大版本的系统(如 Ubuntu 18.04 → 20.04) - 安装时选择 **不自动重启服务**(避免生产环境中断) - 备份系统后再操作 --- #### **方案 4:局部替换 glibc(高风险)** [^4] ```bash # 1. 从高版本系统复制库文件 scp user@new-server:/lib/x86_64-linux-gnu/libc-2.34.so ./libc-2.34.so # 2. 设置局部环境变量 export LD_LIBRARY_PATH=/path/to/new-glibc:$LD_LIBRARY_PATH # 3. 运行程序 /path/to/new-glibc/ld-linux-x86-64.so.2 /app/gateway ``` **风险警告**: - 可能导致系统崩溃 - 仅适用于临时测试 - 需匹配架构(x86_64/arm64) --- #### **方案 5:版本兼容性编译(开发者适用)** 在编译时指定兼容旧版 glibc: ```bash # 编译参数示例(C/C++) g++ main.cpp -o gateway \ -D_GLIBCXX_USE_CXX11_ABI=0 \ -Wl,--rpath=/old/glibc/path \ -static-libstdc++ ``` **关键参数**: - `_GLIBCXX_USE_CXX11_ABI=0`:禁用 C++11 ABI - `-static-libstdc++`:静态链接标准库 --- ### 错误诊断工具 ```bash # 1. 检查当前 glibc 版本 ldd --version # 2. 查看程序依赖的符号版本 objdump -T /path/to/program | grep GLIBC_ # 3. 检测缺失的版本 strings /lib/x86_64-linux-gnu/libc.so.6 | grep GLIBC_ ``` > **决策建议**: > - 开发环境 → 方案 5 > - 生产环境 → 方案 2 (容器化) > - 临时修复 → 方案 4 > - 系统可控 → 方案 3 > - 第三方软件 → 方案 1
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

人间体佐菲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值