请告诉我如何在 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 应用程序的主要内容,如果未能解决你的问题,请参考以下文章