如何在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
调试时系统挂起,反汇编发现代码未正确加载。
原因分析
- 链接地址不匹配:原二进制通过
aem-ve.specs指定链接地址为0x80000000,但QEMUvirt机器的默认内核加载地址是0x40000000,导致代码被加载到错误地址,执行时出现异常。 - 平台初始化代码不兼容:spec中使用的
rdimon-aem-el3.o是针对ARM AEM-VE/Foundation平台的EL3初始化代码,和QEMUvirt机器的硬件环境不匹配,无法完成正确的系统初始化。
可行解决方案
方案一:修改编译配置适配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
相关产品推荐
相关产品推荐

