修复64位系统下adb启动出现/lib/ld-linux.so.2: bad ELF interpreter: No such file or directory 及类似问题

在Fedora 19 x64系统中,遇到执行32位程序时出现/lib/ld-linux.so.2错误。通过安装ia32-libs包,使用yum命令安装所需库,并根据错误提示进一步解决问题。

在64系统里执行32位程序如果出现/lib/ld-linux.so.2: bad ELF interpreter: No such file or directory,


看很多文章说 Ubuntu 可以使用  apt-get install ia32-libs 来解决。


但我的fedora19 X64执行上面未成功,问题不能解决。


在终端里执行./adb 出现/lib/ld-linux.so.2: bad ELF interpreter: No such file or directory错误提示,


执行 sudo yum install ld-linux.so.2,系统会自动安装所需要的库,


继续执行./adb,看错误提示缺少什么,就 install 什么


<think>我们面对的问题是:在RK3568芯片的Android13系统上运行aiot_rk可执行文件时,出现错误`/system/bin/sh: ./aiot_rk: No such file or directory`,而使用`readelf`查看该文件显示`[Requesting program interpreter: /lib/ld-linux-aarch64.so.1]`。这表明系统缺少所需的动态链接器(或加载器)`ld-linux-aarch64.so.1`。 ### 问题分析 1. **错误含义**:错误信息表明shell找不到`aiot_rk`文件或目录,但这里更可能是因为缺少动态链接器。因为当可执行文件需要动态链接器而系统找不到时,也会报告类似错误(尽管严格来说,动态链接器缺失的错误通常是`No such file or directory`,但指向的是动态链接器本身)。 2. **readelf信息解读**:`readelf`显示程序需要`/lib/ld-linux-aarch64.so.1`作为解释器(即动态链接器)。这表明`aiot_rk`是一个动态链接的可执行文件,并且是针对AArch64架构的Linux系统编译的(使用glibc或类似C库)。 ### 解决步骤 由于Android系统通常使用Bionic libc而不是glibc,因此默认情况下可能没有`ld-linux-aarch64.so.1`。我们需要将相应的动态链接器文件放到系统的`/lib`目录下。 #### 步骤1: 确认可执行文件的架构 尽管问题中已经提到RK3568(ARM64),但我们还是确认一下: ```bash file aiot_rk ``` 输出应包含`ELF 64-bit LSB executable, ARM aarch64`。 #### 步骤2: 确定所需的动态链接器版本 通过`readelf -l aiot_rk`可以查看程序头,其中会明确指定需要的动态链接器路径(即`INTERP`段)。我们已经知道是`/lib/ld-linux-aarch64.so.1`。 #### 步骤3: 获取动态链接器 我们需要找到与`aiot_rk`兼容的`ld-linux-aarch64.so.1`文件。通常,这个文件来自编译该可执行文件时使用的工具链(交叉编译工具链)中的库。 ##### 方法1: 从交叉编译工具链中查找 1. 找到用于编译`aiot_rk`的交叉编译工具链(例如gcc-linaro-aarch64-linux-gnu等)。 2. 在工具链的库目录中查找`ld-linux-aarch64.so.1`。通常路径类似于: ``` ${TOOLCHAIN_PATH}/aarch64-linux-gnu/libc/lib/ld-linux-aarch64.so.1 ``` 或者 ``` ${TOOLCHAIN_PATH}/aarch64-linux-gnu/libc/usr/lib/ld-linux-aarch64.so.1 ``` 注意:`ld-linux-aarch64.so.1`通常是一个指向具体版本(如`ld-2.27.so`)的软链接。我们需要获取软链接指向的实际文件,或者同时获取软链接和实际文件。 ##### 方法2: 从已有系统中提取(如果存在) 如果其他系统(如Linux发行版)有相同架构和兼容的C库版本,可以从中复制。但要注意版本兼容性。 #### 步骤4: 放置动态链接器到Android文件系统 Android系统通常没有`/lib`目录(而是使用`/system/lib`或`/system/lib64`),但我们的可执行文件要求放在`/lib`下。因此,我们需要: 1. 将`ld-linux-aarch64.so.1`文件推送到设备的`/lib`目录(如果不存在则需要创建)或者创建一个符号链接指向正确置。 由于Android的根文件系统通常是只读的,我们需要以root权限操作。 具体操作: ```bash # 假设已经获取了ld-linux-aarch64.so.1,将其重命名为ld-linux-aarch64.so.1(如果实际文件是ld-2.27.so,则需要同时复制并设置软链接) adb push ld-linux-aarch64.so.1 /data/local/tmp/ adb shell su # 创建/lib目录(如果不存在) mkdir -p /lib # 复制文件 cp /data/local/tmp/ld-linux-aarch64.so.1 /lib/ # 确保文件权限 chmod 755 /lib/ld-linux-aarch64.so.1 ``` 或者,如果设备上已有该文件但于其他路径(比如在/system/lib64下),可以创建软链接: ```bash ln -s /system/lib64/ld-linux-aarch64.so.1 /lib/ld-linux-aarch64.so.1 ``` 但注意:Android的Bionic libc并不提供`ld-linux-aarch64.so.1`,所以通常设备上不会有该文件。因此,我们需要从外部获取并放置。 #### 步骤5: 测试 再次运行`aiot_rk`,看是否能够正常运行。 ### 注意事项 1. **依赖库**:除了动态链接器,可执行文件可能还依赖其他共享库(如libc.so.6等)。我们可以使用`readelf -d aiot_rk`查看依赖的共享库。这些库也需要放在系统的库路径(如`/lib`或`/usr/lib`)中。同样,我们可以从工具链中获取这些库。 2. **Android系统的限制**:Android系统使用不同的C库(Bionic),与标准的glibc不兼容。因此,如果`aiot_rk`是使用glibc编译的,那么在Android上运行时可能需要完整的glibc环境。这可能会导致兼容性问题。如果可能,建议使用Android NDK重新编译该程序以使用Bionic libc。 ### 替代方案(推荐) 如果上述方法无效或遇到兼容性问题,考虑: - **使用静态链接**:重新编译`aiot_rk`为静态链接(编译时加上`-static`),这样就不需要动态链接器。 - **使用Android NDK重新编译**:使用Android NDK为Android系统重新编译程序,这样生成的程序将使用Bionic libc,兼容性更好。 ### 总结 主要步骤为: 1. 获取正确的`ld-linux-aarch64.so.1`文件(从编译用的工具链中获取)。 2. 将其放入设备的`/lib`目录下。 3. 确保可执行文件的其他依赖库也存在。 如果问题仍然存在,请检查其他依赖库是否缺失,或者考虑重新编译程序以适配Android环境。 §§相关问题§§ 1. 如何确定可执行文件依赖哪些共享库? 2. 如何交叉编译一个静态链接的可执行文件? 3. 如何使用Android NDK编译程序以在Android上运行? 4. 在Android系统中,如何永久性地添加自定义库路径? </think>### 问题分析与解决方案 您在 RK3568 (ARM64架构) 的 Android 13 系统中运行 `aiot_rk` 时遇到错误 `/system/bin/sh: ./aiot_rk: No such file or directory`,而 `readelf` 显示程序需要动态链接器 `/lib/ld-linux-aarch64.so.1`。这是由于 Android 系统未包含 glibc 的动态链接器(通常使用 Bionic libc),需要手动添加兼容的动态链接器。 --- ### 解决步骤 #### 1. **确认动态链接器路径** 通过 `readelf` 检查可执行文件的依赖: ```bash readelf -a aiot_rk | grep "Requesting program interpreter" ``` 输出应为:`[Requesting program interpreter: /lib/ld-linux-aarch64.so.1]`。 #### 2. **获取兼容的动态链接器** 需从 ARM64 Linux 环境中提取: - **方法一:从交叉编译工具链获取** - 在 SDK 路径查找(如引用[3]中的 `/home/h/proj/rk356x_sdk-linux5.10/`): ```bash find /path/to/sdk -name "ld-linux-aarch64.so.1" ``` - 典型路径:`prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1/lib/gcc/aarch64-linux-gnu/6.3.1/ld-linux-aarch64.so.1` - **方法二:从已有设备提取** 若其他 Linux 设备使用 RK3568 芯片(如引用[4]中的 Rock3A),执行: ```bash adb pull /lib/ld-linux-aarch64.so.1 . ``` #### 3. **放置到 Android 文件系统** 将文件推送到设备并设置权限: ```bash adb push ld-linux-aarch64.so.1 /system/lib/ adb shell chmod 0644 /system/lib/ld-linux-aarch64.so.1 ``` > **注意**:若 `/system` 只读,需先重新挂载为可写: > ```bash > adb root > adb remount > ``` #### 4. **验证动态链接库依赖** 检查其他依赖库是否缺失: ```bash readelf -d aiot_rk | grep "Shared library" ``` 若有其他缺失库(如 `libstdc++.so`),同样需从工具链复制到 `/system/lib/`。 #### 5. **测试运行** ```bash adb shell cd /path/to/aiot_rk chmod +x aiot_rk ./aiot_rk ``` --- ### 故障排查 1. **权限问题**: - 确保 `aiot_rk` 有可执行权限:`chmod +x aiot_rk` - 动态链接器权限需为 `0644`。 2. **架构兼容性**: - 确认动态链接器是 ARM64 版本: ```bash file ld-linux-aarch64.so.1 ``` 输出应含 `ELF 64-bit LSB shared object, ARM aarch64`。 3. **备选方案**: - **静态编译**:重新编译 `aiot_rk` 为静态链接(编译时加 `-static`)。 - **使用 Android NDK**:改用 NDK 编译可执行文件,直接兼容 Bionic libc[^3]。 --- ### 关键点总结 | 步骤 | 操作 | 目标 | |------|------|------| | 1 | 检查依赖 | 确认缺失的 `/lib/ld-linux-aarch64.so.1` | | 2 | 获取链接器 | 从 SDK 工具链或 Linux 设备提取 | | 3 | 推送文件 | 复制到 `/system/lib/` 并设置权限 | | 4 | 补全其他库 | 检查并添加缺失的共享库 | | 5 | 测试运行 | 验证可执行文件正常工作 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值