QEMU中无法启动最小化汇编UEFI程序,报‘Command Error Status: Not Found’
EFI程序启动失败「Command Error Status: Not Found」问题修复
核心问题诊断
你的问题出在PE格式不符合UEFI规范、入口点签名不匹配以及链接/复制过程遗漏关键段这几个点上,和UEFI配置无关,以下是针对性修复方案:
1. 修正链接脚本格式
原链接脚本使用pei-x86-64格式,这是UEFI固件PEI阶段的模块格式,而非用户态EFI应用的标准格式。需改为ELF64格式,后续由objcopy转成EFI应用格式:
修改后的efi.ld:
OUTPUT_FORMAT("elf64-x86-64") ENTRY(efi_main) SECTIONS { . = 0x1000; .text : { *(.text) } .data : { *(.data) } .rdata : { *(.rdata) } .bss : { *(.bss COMMON) } }
2. 补充objcopy的重定位段
UEFI加载器需要.reloc段处理重定位信息,原命令遗漏该段,导致二进制无法被正确识别:
修改Makefile中BOOTX64.EFI生成命令:
BOOTX64.EFI: boot.pe objcopy -j .text -j .data -j .bss -j .reloc \ --target=efi-app-x86_64 boot.pe BOOTX64.EFI
3. 对齐UEFI入口点签名规范
UEFI要求入口点必须接收ImageHandle和SystemTable两个参数,即使你的代码不用这两个参数,也需要保留签名占位:
修改后的boot.S:
.section .text .code64 .global efi_main efi_main: # 遵循UEFI入口签名:rdi=ImageHandle, rsi=SystemTable xor %eax, %eax # 返回EFI_SUCCESS(0) .loop: jmp .loop
4. 初始化OVMF变量文件
如果本地没有OVMF_VARS.fd,需从系统目录复制初始化,否则QEMU会使用空文件导致UEFI配置异常,在Makefile中添加生成规则:
OVMF_VARS.fd: cp /usr/share/OVMF/OVMF_VARS.fd ./OVMF_VARS.fd
修改后的完整代码
boot.S
.section .text .code64 .global efi_main efi_main: # 遵循UEFI入口签名:rdi=ImageHandle, rsi=SystemTable xor %eax, %eax # 返回EFI_SUCCESS(0) .loop: jmp .loop
efi.ld
OUTPUT_FORMAT("elf64-x86-64") ENTRY(efi_main) SECTIONS { . = 0x1000; .text : { *(.text) } .data : { *(.data) } .rdata : { *(.rdata) } .bss : { *(.bss COMMON) } }
Makefile
all: fat.img boot.o: boot.S as --64 -o boot.o boot.S boot.pe: boot.o efi.ld ld -nostdlib -e efi_main -T efi.ld -o boot.pe boot.o BOOTX64.EFI: boot.pe objcopy -j .text -j .data -j .bss -j .reloc \ --target=efi-app-x86_64 boot.pe BOOTX64.EFI fat.img: BOOTX64.EFI mkdir -p iso/EFI/BOOT cp BOOTX64.EFI iso/EFI/BOOT dd if=/dev/zero of=fat.img bs=1M count=10 mkfs.vfat fat.img mcopy -i fat.img -s iso/* ::/ run: OVMF_VARS.fd fat.img qemu-system-x86_64 \ -drive if=pflash,format=raw,readonly=on,file=/usr/share/OVMF/OVMF_CODE.fd \ -drive if=pflash,format=raw,file=./OVMF_VARS.fd \ -drive format=raw,file=fat.img \ -net none OVMF_VARS.fd: cp /usr/share/OVMF/OVMF_VARS.fd ./OVMF_VARS.fd clean: rm -rf BOOTX64.EFI *.o *.pe iso fat.img OVMF_VARS.fd
测试步骤
- 执行
make clean && make run,自动完成编译、镜像生成和QEMU启动 - 若进入UEFI shell,手动执行
fs0:\EFI\BOOT\BOOTX64.EFI,程序会进入无限循环(无屏幕输出,但不会再报Not Found错误) - 如需自动启动,可在UEFI shell执行
bcfg boot add 0 fs0:\EFI\BOOT\BOOTX64.EFI "My EFI App",保存变量后下次启动会自动加载
内容的提问来源于stack exchange,提问作者Bart
相关产品推荐
相关产品推荐

