适用于英特尔Galileo的UEFI应用程序(i586)

时间:2016-11-19 20:04:28

标签: gcc uefi intel-galileo gnu-efi

我正在开发一个简单的应用程序,该应用程序将作为UEFI应用程序在Intel Galileo的主板上运行。我开始使用" Hello,World"应用程序并在qemu-system-i386下进行测试,效果很好。然后,我在Galileo EFI Shell下运行它并且卡住(没有任何事情发生,也从未返回任何内容 - 就像一个永无止境的循环)。我知道英特尔Galileo的Quark处理器是i586架构。由于向后兼容性,在i586下运行为i386编译的应用程序不应该是一个问题,我是对的吗?或者我错过了什么?

我使用Ubuntu 14.04(32位)进行GCC 5.4.0开发(默认)。另外,我在版本3.0.4中使用了gnu-efi。

我应该构建交叉编译器吗?它会解决我所有的问题吗?有必要吗?

以下是示例代码:

#include <efi.h>
#include <efilib.h>

EFI_STATUS EFIAPI efi_main(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable) {
    InitializeLib(ImageHandle, SystemTable);
    Print(L"Hello, World!\n");

    return EFI_SUCCESS;
}

这是我的Makefile:

ARCH            = ia32

OBJS            = src/main.o
HEADERS         = 
TARGET          = build/main.efi

EFIINC          = lib/gnu-efi/inc
EFIINCS         = -I$(EFIINC) -I$(EFIINC)/$(ARCH) -I$(EFIINC)/protocol
LIB             = lib/gnu-efi/$(ARCH)/lib
EFILIB          = lib/gnu-efi/gnuefi
EFI_CRT_OBJS    = $(EFILIB)/crt0-efi-$(ARCH).o
EFI_LDS         = $(EFILIB)/elf_$(ARCH)_efi.lds

CFLAGS          = $(EFIINCS) -ffreestanding -fno-stack-protector -fpic -fshort-wchar -mno-red-zone -Wall -masm=intel

LDFLAGS         = -nostdlib -znocombreloc -T $(EFI_LDS) -shared -Bsymbolic -L $(EFILIB) -L $(LIB) $(EFI_CRT_OBJS)

all: $(TARGET)

build: $(TARGET)

src/%.so: $(OBJS) $(HEADERS)
    ld $(LDFLAGS) $(OBJS) -o $@ -l:libefi.a -l:libgnuefi.a

build/%.efi: src/%.so
    objcopy -j .text -j .sdata -j .data -j .dynamic \
        -j .dynsym  -j .rel -j .rela -j .reloc \
        --target=efi-app-$(ARCH) $^ $@

run:
    qemu-system-i386 bin/OVMF.fd -hda fat:build

.PHONY: all build run

0 个答案:

没有答案