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

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

测试步骤

  1. 执行make clean && make run,自动完成编译、镜像生成和QEMU启动
  2. 若进入UEFI shell,手动执行fs0:\EFI\BOOT\BOOTX64.EFI,程序会进入无限循环(无屏幕输出,但不会再报Not Found错误)
  3. 如需自动启动,可在UEFI shell执行bcfg boot add 0 fs0:\EFI\BOOT\BOOTX64.EFI "My EFI App",保存变量后下次启动会自动加载

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 22:07:06