You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为Android交叉编译C程序遇执行及链接错误求助

问题分析与解决方案

为什么Ubuntu的可执行文件在Android上无法运行?

你遇到的sh: not executable: 64-bit ELF file错误,核心原因是CPU架构不兼容,结合两个file命令的输出就能明确:

  • 你的Ubuntu可执行文件是x86-64架构,而Android设备是ARM aarch64架构——不同架构的二进制文件无法跨平台运行。
  • 动态链接器也不匹配:Ubuntu使用/lib64/ld-linux-x86-64.so,Android则用/system/bin/linker64,这也会导致无法加载执行。

所以必须针对Android的ARM64架构重新编译fio,不能直接复用Ubuntu的二进制文件。

解决fio编译时的链接错误

你遇到的incompatible target和undefined reference错误,主要是工具链选择错误,以及fio依赖的部分Linux系统函数在Android中不存在。下面是具体修复步骤:

1. 使用正确的ARM64工具链

你之前用的arm-linux-androideabi-gcc是针对32位ARM的工具链,而你的设备是64位ARM(aarch64),应该改用NDK中的aarch64-linux-android工具链。另外,NDK现在推荐用Clang而非老旧的GCC,兼容性更好。

假设你的NDK路径是~/android-ndk-r25b(替换成你实际的NDK路径),工具链位于~/android-ndk-r25b/toolchains/llvm/prebuilt/linux-x86_64/bin。

2. 配置configure参数,禁用Android不支持的功能

fio默认启用的部分功能依赖Android没有的标准Linux库函数(比如inet_network、setmntent等),需要在configure时禁用这些功能:

./configure \
  --host=aarch64-linux-android \
  --cc=aarch64-linux-android21-clang \
  --sysroot=~/android-ndk-r25b/toolchains/llvm/prebuilt/linux-x86_64/sysroot \
  --disable-net \
  --disable-cgroup \
  --disable-libnuma \
  --disable-zoned

参数说明:

  • --host=aarch64-linux-android:指定目标架构为ARM64
  • --cc=aarch64-linux-android21-clang:使用NDK的Clang编译器,21是Android API级别(可根据你的设备系统版本调整,比如API 23对应Android 6.0+)
  • --sysroot:指定Android系统根目录,确保编译器能找到正确的头文件和库
  • --disable-net:禁用网络引擎,避免inet_network等未定义引用
  • --disable-cgroup:禁用cgroup支持,避免setmntent等未定义引用
  • --disable-libnuma/--disable-zoned:禁用Android不支持的NUMA和分区存储功能

3. 编译并部署到设备

执行编译:

make

编译完成后,将生成的fio推送到Android设备并赋予执行权限:

adb push fio /data/local/tmp/
adb shell chmod +x /data/local/tmp/fio

现在就可以在设备上运行fio了:

adb shell /data/local/tmp/fio --version

内容的提问来源于stack exchange,提问作者Melvin Bosnjak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:17:00