请告诉我如何在 QEMU 上运行我的 UEFI 应用程序

Posted

技术标签:

【中文标题】请告诉我如何在 QEMU 上运行我的 UEFI 应用程序【英文标题】:Please tell me how to run my UEFI application on QEMU 【发布时间】:2016-05-13 18:56:12 【问题描述】:

我的环境是 Ubuntu15.10。 我写了以下源代码。

#include "efi.h"
#include "efilib.h"

EFI_STATUS
EFIAPI
efi_main(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)

    InitializeLib(ImageHandle, SystemTable);
    Print(L"HelloWorld\n");

    return EFI_SUCCESS;

我编写了以下Makefile并编译了源代码。

ARCH    = $(shell uname -m | sed s,i[3456789]86,ia32,)
OBJS    = main.o
TARGET  = hello.efi

EFIINC  = /usr/include/efi
EFIINCS = -I$(EFIINC) -I$(EFIINC)/$(ARCH) -I$(EFIINC)/protocol
EFILIB  = /usr/lib
EFI_CRT_OBJS    = $(EFILIB)/crt0-efi-$(ARCH).o
EFI_LDS = $(EFILIB)/elf_$(ARCH)_efi.lds
CFLAGS  = $(EFIINCS) -fno-stack-protector -fpic \
    -fshort-wchar -mno-red-zone -Wall
ifeq ($(ARCH),x86_64)
    CFLAGS  += -DEFI_FUNCTION_WRAPPER
endif
LDFLAGS = -nostdlib -znocombreloc -T $(EFI_LDS) -shared \
    -Bsymbolic -L $(EFILIB) -L $(LIB) $(EFI_CRT_OBJS)
all: $(TARGET)
hello.so:$(OBJS)
    ld $(LDFLAGS) $(OBJS) -o $@ -lefi -lgnuefi
%.efi: %.so
    objcopy -j .text -j .sdata -j .data -j .dynamic \
        -j .dynsym  -j .rel -j .rela -j .reloc \
        --target=efi-app-$(ARCH) $^ $@

我将 hello.efi 存储在命名的 RT 目录中,然后运行“qemu-system-x86_64 -bios OVMF.fd -hda fat:RT/”。 我运行 hello.efi 但不执行我的 UEFI 应用程序。 Qemu 说“错误报告:无效参数”。

请帮帮我!

【问题讨论】:

您的应用代码基于什么?您是否尝试过构建和运行 gnu-efi 测试应用程序? 是的。此测试应用由 gnu-efi 编译。 您是否按照我的要求尝试构建和运行 gnu-efi 附带的测试应用程序? 对不起。我尝试在 QEMU 上运行测试应用程序并成功运行。我尝试在测试应用程序环境中构建我的源代码。它成功地工作了。 ... 【参考方案1】:

LDFLAGS 中的LDFLAGS 中删除-L $(LIB) 有助于:

【讨论】:

你能详细说明一下变化吗? 没有。我只删除“-L $(LIB)”。 嗯,这是详细说明的一部分,您应该在答案中写下,否则很难看出有什么变化。你知道为什么/如何改变这个问题吗? 我不知道为什么或修复了问题。谢谢你修复文本。对不起。我英语不好...【参考方案2】:

你不需要'main()' vs. 'efi_main()'吗?

【讨论】:

以上是关于请告诉我如何在 QEMU 上运行我的 UEFI 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

UEFI实战Windows版本QEMU网络配置

UEFI实战Windows版本QEMU网络配置

yocto / qemu 中的 efi 变量

sh qemu-uefi.sh

为啥我的程序不是由 qemu 运行的,是因为它仅用于模拟 Linux——在 Linux 上

用QEMU虚拟国产飞腾主机环境