Как скомпилировать приложение UEFI с использованием GNU-EFI?

Я пытался скомпилировать код UEFI, используя gnu-efi, Но я не понимаю, как скомпилировать код приложения UEFI.

я получил gnu-efi 3.0.2, распакуйте и введите make && make install, Я пишу привет код мира:

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

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

    return EFI_SUCCESS;
}

Моя ОС - Ubuntu 15.04.

1 ответ

Решение
  1. Включить файлы GNU-EFI

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

    похоже, что ваши включает, где удалены SO

  2. создать файл make;

Если вы собирали программу "Hello, World" для Linux в среде Linux, вы могли бы скомпилировать ее без Makefile. Однако сборка программы в Linux для EFI по сути является операцией кросс-компиляции. В связи с этим необходимо использовать необычные параметры компиляции и компоновщика, а также операцию пост-компоновки для преобразования программы в форму, которую EFI примет. Хотя вы можете набрать все соответствующие команды вручную, 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
LIB             = /usr/lib64
EFILIB          = /usr/lib64/gnuefi
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) $^ $@

ссылка:

http://www.rodsbooks.com/efi-programming/hello.html

В Ubuntu 18.04 эти две строки:

LIB             = /usr/lib64

EFILIB          = /usr/lib64/gnuefi

необходимо изменить на:

LIB             = /usr/lib

EFILIB          = /usr/lib
Другие вопросы по тегам