交叉编译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
相关产品推荐
相关产品推荐

