qemu仿真可执行二进制文件时出现错误:/lib/ld-uClibc.so.0: No such file or directory的解决方法

在qemu仿真实验中遇到/lib/ld-uClibc.so.0和文件加载错误。通过调整qemu与目标二进制文件的位置,发现qemu必须放在squashfs-root目录下,并使用chroot指定该目录为根目录,才能成功仿真。仿真步骤包括确定组件架构、选择相应qemu、拷贝qemu到squashfs-root并使用chroot执行仿真。
AI助手已提取文章相关产品:

在进行固件的可执行开源组件仿真实验时,遇到了一些小的问题。

(1)/lib/ld-uClibc.so.0: No such file or directory

(2)Error while loading XXX No such file or directory

于是搜了一下,在看雪论文中查到了同样的问题。https://bbs.pediy.com/thread-247302.htm

再来看一下我所执行的情况:

测试的busybox所在的文件目录:

/home/ubuntu/zgd/firmwareExtracted/Zyxel/_94018be529bd8c14faf3d12226e230dec68a72ae.zip.extracted/_V310_1.00AABT.2C0.img.extracted/squashfs-root

上面这个图说明什么意思呢?

第一个红色框线内,是我把qemu放在了和要被仿真的busybox的同一级目录下,发现出现了/lib/ld-uClibc.so.0: No such file or directory错误。

第二个红色框线内,是我把qemu放在了busybox的上一级目录下,也就是squashfs-root目录下面,发现仿真成功。

第三个红色框线内,是我把qemu放在了squashfs-root的上一级目录下,发现依然是出现了/lib/ld-uClibc.so.0: No such file or directory错误。

那么我就试图尝试一下,将qemu放在其他的文件夹下,然后指定busybox所在的目录,发现出现文件加载错误,也就是说将qemu和仿真的二进制文件放在不相关的目录(不在squashfs-root目录下)下是不行的。

出现错误:

Error while loading /home/ubuntu/zgd/firmwareExtracted/Zyxel/_94018be529bd8c14faf3d12226e230dec68a72ae.zip.extracted/_V310_1.00AABT.2C0.img.extracted/squashfs-root/bin/busybox: No such file or directory

接着我又做了一个很弱智的尝试,将要仿真的那个组件busybox拷贝到其他目录下,将qemu和busybox放在同一目录下,然后再次进行仿真发现依旧是出现/lib/ld-uClibc.so.0: No such file or directory错误。

总结一下:qemu仿真二进制文件的时候,仿真需要依赖squashfs-root下的环境,可能依赖其他的库文件等情况。所以仿真的时候需要将qemu放在squashfs-root文件夹下。使用chroot指定当前文件夹为根目录运行相关的命令。

可执行二进制文件仿真步骤简单来说就是:(1)查找开源组件的架构、32-bit或64-bit、大小端等信息。(2)根据(1)的信息选择对应的qemu类型。(3)将选择的qemu拷贝到要仿真固件的squashfs-root目录下。在squashfs-root目录下执行命令cp `which qemu-mipsel-static` ./。(4)使用chroot进行仿真命令执行,如sudo chroot ./qemu-mipsel-static bin/busybox。

博主初涉可执行文件的仿真,如进入误区,请留言指导,谢谢!不喜勿喷!

 

您可能感兴趣的与本文相关内容

<think> 我们遇到了错误:`Error while loading /lib/ld-uClibc.so.0: No such file or directory` 原因:在主机系统中,`/lib/ld-uClibc.so.0` 路径不存在,因为主机通常是glibc环境,而uClibc是嵌入式系统常用的轻量级C库。 解决方案:我们需要为QEMU用户模式模拟指定一个包含MIPS架构的uClibc动态链接器和依赖库的根文件系统(rootfs)。 步骤如下: 1. **获取MIPS架构的uClibc根文件系统**: - 方法1:从嵌入式设备(如OpenWRT路由器)中提取。 - 方法2:下载预编译的构建环境(如Buildroot的输出)。 - 方法3:使用第三方提供的rootfs(如Debian MIPSEL)。 2. **设置`QEMU_LD_PREFIX`环境变量**: 指向下载或提取的rootfs的绝对路径,例如: ```bash export QEMU_LD_PREFIX=/path/to/mips-rootfs ``` 注意:rootfs内部结构通常包含`lib`、`usr/lib`等目录,其中存放动态库。 3. **使用绝对路径调用动态链接器**: 由于rootfs中的动态链接器路径可能不同,需要指定rootfs内的绝对路径: ```bash qemu-mips-static $QEMU_LD_PREFIX/lib/ld-uClibc.so.0 --list src/.libs/sstpc ``` 或更简洁地: ```bash qemu-mips-static -L $QEMU_LD_PREFIX /lib/ld-uClibc.so.0 --list src/.libs/sstpc ``` (`-L` 选项等同于设置 `QEMU_LD_PREFIX`) 4. **替代方案(直接运行二进制)**: 也可以直接运行目标二进制,QEMU会自动加载动态链接器: ```bash qemu-mips-static -L $QEMU_LD_PREFIX src/.libs/sstpc ``` 但要查看依赖库列表,使用动态链接器的方式更直接。 如果仍然找不到文件,检查: - `$QEMU_LD_PREFIX/lib` 下是否存在 `ld-uClibc.so.0`(或类似名称,注意版本)。 - 确保rootfs的架构与二进制匹配(此处为MIPS 32位小端)。 示例:使用OpenWRT SDK提供的rootfs - 下载OpenWRT SDK for MIPSEL(小端MIPS)。 - 解压后,rootfs通常在`staging_dir/target-mipsel_xxxx/root-xxxx`目录下。 注意:如果二进制是动态链接的,则rootfs中必须包含所有依赖库(如libcrypto.so等)。 §§相关问题§§ 1. 如何获取适用于 MIPS 架构的轻量级 uClibc 根文件系统(rootfs)? 2. 在配置 QEMU 用户模式,如何解决动态链接器路径与目标 rootfs 中实际路径不一致的问题? 3. 除了 uClibc,还有哪些常见的嵌入式 C 运行库(如 musl libc)?如何为它们配置 QEMU 模拟环境? 4. 当使用 `QEMU_LD_PREFIX` ,如何确保系统中存在对应架构的动态链接器(如 ld-musl-mipsel.so.1)? 5. 如果 QEMU 报告 "Library not found" 错误,有哪些调试步骤可以追踪缺失的库依赖? </think> 根据命令 `qemu-mips-static /lib/ld-uClibc.so.0 --list src/.libs/sstpc` 返回的 `Error while loading /lib/ld-uClibc.so.0: No such file or directory` 错误,以下是根本原因和解决方案: --- ### 错误原因分析 1. **核心问题**: QEMU 用户模式找不到 MIPS 架构的动态链接器 `ld-uClibc.so.0`,因为: - 该文件**不存在于主机系统**(x86/x64 环境) - `QEMU_LD_PREFIX` **未正确配置**,指向 MIPS rootfs 路径 - rootfs 目录中**缺少 uClibc 运行文件** 2. **路径验证**: 检查主机系统确实没有该文件: ```bash ls /lib/ld-uClibc.so* # 应返回 "No such file" ``` --- ### 完整解决方案 #### 步骤 1:获取 MIPS uClibc rootfs 下载或构建包含 `ld-uClibc.so.0` 的 MIPS 根文件系统: ```bash # 方法 1:下载预编译的 OpenWRT rootfs(推荐) wget https://downloads.openwrt.org/releases/22.03.0/targets/malta/be/openwrt-22.03.0-malta-be-rootfs.tar.gz tar -xvf openwrt-22.03.0-malta-be-rootfs.tar.gz -C ~/mips-rootfs # 方法 2:使用 Buildroot 构建(需编译) git clone https://github.com/buildroot/buildroot cd buildroot && make qemu_mips32el_malta_defconfig make ``` #### 步骤 2:设置 QEMU 环境变量 配置动态链接器搜索路径: ```bash export QEMU_LD_PREFIX=~/mips-rootfs # 指向解压的 rootfs 目录 ``` #### 步骤 3:修正命令路径 使用 rootfs 内的**绝对路径**调用动态链接器: ```bash qemu-mips-static $QEMU_LD_PREFIX/lib/ld-uClibc.so.0 --list src/.libs/sstpc ``` 或使用 `-L` 缩写: ```bash qemu-mips-static -L ~/mips-rootfs /lib/ld-uClibc.so.0 --list src/.libs/sstpc ``` #### 步骤 4:验证依赖库存在 检查 rootfs 是否包含所需文件: ```bash ls $QEMU_LD_PREFIX/lib/ld-uClibc.so* # 确认链接器存在 ls $QEMU_LD_PREFIX/lib/libc.so* # 确认基础 C 库存在 ``` > ✅ **成功标志**: > 正确执行后将显示二进制依赖库列表,例如: > ``` > libc.so.0 => /lib/libc.so.0 > libssl.so.1.1 => /usr/lib/libssl.so.1.1 > ``` --- ### 常见问题排查 | 问题现象 | 解决方案 | |---------|---------| | `Error loading shared library` | 将缺失的 .so 文件复制到 `$QEMU_LD_PREFIX/lib` | | 架构不匹配错误 | 确认 rootfs 为 **MIPS32 小端**(非 MIPS64 或大端) | | 权限错误 | 执行 `chmod +x $QEMU_LD_PREFIX/lib/*.so*` | | 符号链接失效 | 在 rootfs 内运行 `ldconfig -v` 重建链接 |
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值