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

交叉编译AArch64架构clone系统调用后QEMU运行报错原因排查

问题:交叉编译AArch64 clone系统调用后QEMU运行报错

我尝试交叉编译clone系统调用并通过qemu-aarch64运行,相关信息如下:

汇编代码

#include <sys/syscall.h>

.section .text
.global _start
_start:
bl main
b .

.global main
main:

mov x0, #0
mov x1, #0
mov x2, #0
mov x3, #0
mov x4, #0
mov x8, SYS_clone
svc #1

cmp x0, #0
bgt 1f
mov x0, #1
ret
1:

编译命令

aarch64-linux-gnu-gcc clone.S -ffreestanding -nostartfiles -e _start -static -c

编译得到的clone.o是ELF 64-bit LSB可重定位文件(ARM aarch64架构),但执行qemu-aarch64-static ./clone.o时提示:

qemu-aarch64-static: ./clone.o: Invalid ELF image for this architecture

请问该报错原因是什么?


原因及解决方法
  • 报错核心原因:你生成的clone.o是可重定位目标文件,属于编译过程的中间产物,仅包含未完成链接的代码和符号,并非可直接执行的二进制程序。QEMU只能加载运行ELF类型为EXEC的可执行文件,无法识别REL类型的可重定位目标文件,因此报错。

  • 解决方法:移除编译命令中的-c参数,让编译器完成链接步骤,生成完整的可执行文件。修改后的编译命令:

aarch64-linux-gnu-gcc clone.S -ffreestanding -nostartfiles -e _start -static -o clone

执行该命令后会生成名为clone的可执行文件,此时运行qemu-aarch64-static ./clone即可正常执行。

额外提示:你的汇编代码存在小问题——父进程跳到1:标签后没有后续指令,会触发未定义行为。建议在1:后添加退出系统调用,示例如下:

1:
mov x0, #0      // 设置退出码为0
mov x8, #93     // SYS_exit的系统调用号(AArch64)
svc #1          // 触发系统调用退出进程

内容的提问来源于stack exchange,提问作者python3.789

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 13:00:55