Приложение UEFI для Intel Galileo (i586)
Я работаю над простым приложением, которое будет работать на плате Intel Galileo в качестве приложения UEFI. Я начал с приложения "Hello, World" и проверил его в qemu-system-i386
и это работает хорошо. Затем я запустил его в оболочке Galileo EFI, и он завис (ничего не произошло и никогда ничего не возвращалось - как бесконечный цикл). Я знаю, что процессор Intel Galileo Quark - это архитектура i586. Это не должно быть проблемой для запуска приложения, скомпилированного для i386 под i586, из-за обратной совместимости, я прав? Или я что-то упустил?
Я использую Ubuntu 14.04 (32-разрядная версия) для разработки с GCC 5.4.0 (по умолчанию). Также я использую gnu-efi в версии 3.0.4.
Должен ли я построить кросс-компилятор? Это решит все мои проблемы? Это необходимо?
Вот пример кода:
#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