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

如何在QEMU上运行基于AArch64裸机的Hello World程序?

在QEMU运行ARM Foundation平台编译的裸机Hello World程序的解决方案

问题背景

已在ARM Foundation Platform上编译并运行裸机Hello World程序,代码、编译链接命令及使用的aem-ve.specs文件如下:

程序代码

#include <stdio.h>

int main(int argc, char *argv[])
{
    printf("Hello world!\n");
    return 0;
}

原编译链接命令

# 编译(原命令存在参数错误,会触发警告)
aarch64-none-elf-gcc -c -march=armv8-a -g hello.c hello.o
# 链接
aarch64-none-elf-gcc -specs=aem-ve.specs -Wl,-Map=linkmap.txt hello.o -o hello.axf

aem-ve.specs文件内容

cat ./aarch64-none-elf/lib/aem-ve.specs 
# aem-ve.specs
#
# Spec file for AArch64 baremetal newlib, libgloss on VE platform with version 2
# of AngelAPI semi-hosting.
#
# This Spec file is also appropriate for the foundation model.

%rename link old_link

*link:
-Ttext-segment 0x80000000 %(old_link)

%rename lib libc

*libgloss:
-lrdimon

*lib:
cpu-init/rdimon-aem-el3.o%s --start-group %(libc) %(libgloss) --end-group

*startfile:
crti%O%s crtbegin%O%s %{!pg:rdimon-crt0%O%s} %{pg:rdimon-crt0%O%s}

尝试在QEMU运行时使用命令:

qemu-system-aarch64 -semihosting -m 128M -nographic  -monitor none -serial stdio  -machine virt,gic-version=2,secure=on,virtualization=on -cpu cortex-a53 -kernel hello.axf -S -gdb tcp::9000

调试时系统挂起,反汇编发现代码未正确加载。


原因分析

  1. 链接地址不匹配:原二进制通过aem-ve.specs指定链接地址为0x80000000,但QEMU virt机器的默认内核加载地址是0x40000000,导致代码被加载到错误地址,执行时出现异常。
  2. 平台初始化代码不兼容:spec中使用的rdimon-aem-el3.o是针对ARM AEM-VE/Foundation平台的EL3初始化代码,和QEMU virt机器的硬件环境不匹配,无法完成正确的系统初始化。

可行解决方案

方案一:修改编译配置适配QEMU virt机器

1. 修正编译命令

原编译命令存在参数错误,正确的编译命令应为:

aarch64-none-elf-gcc -c -march=armv8-a -g hello.c -o hello.o

2. 适配QEMU virt的链接命令

使用适配QEMU virt的链接配置,替换原aem-ve.specs:

# 使用多数交叉编译工具链自带的rdimon.specs
aarch64-none-elf-gcc -specs=rdimon.specs -Wl,-Ttext=0x40000000 -Wl,-Map=linkmap.txt hello.o -o hello.axf

如果没有rdimon.specs,也可以手动指定依赖库:

aarch64-none-elf-gcc -Wl,-Ttext=0x40000000 hello.o -o hello.axf -lrdimon -lc -lgcc

3. 对应的QEMU运行命令

qemu-system-aarch64 -semihosting -m 128M -nographic -monitor none -serial stdio -machine virt,gic-version=2 -cpu cortex-a53 -kernel hello.axf

若需要调试,添加-S -gdb tcp::9000参数即可。


方案二:用QEMU模拟AEM-VE平台直接运行原二进制

QEMU支持模拟ARM AEM-VE平台,可直接运行原编译好的hello.axf:

qemu-system-aarch64 -semihosting -nographic -machine ve-aarch64 -cpu cortex-a57 -kernel hello.axf -m 1024

该命令使用ve-aarch64机器模拟AEM-VE平台,内存设置为1024MB(匹配原平台内存范围,确保0x80000000地址在内存范围内)。


内容的提问来源于stack exchange,提问作者Little Tree

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 08:04:43