※この記事の動作はまだ未確認です。
UEFIでOS無しにプログラムを実行するやり方を書いていきます。
あらかじめ、make、gcc、また、llvmも入れてllvm-objcopyを用意しておきます。
今回はここ(https://orumin.blogspot.com/2014/12/uefi.html)の記事を参考に進めます。
まず、上記URLのMakefileを下記のように書きかえます。
書き換えるのはARCHとFORMAT、OBJCOPYのパラメータの箇所です。
# Filename: Makefile
ARCH = aarch64
EFIROOT = /usr
HDDRROOT = $(EFIROOT)/include/efi
INCLUDES = -I. -I$(HDDRROOT) -I$(HDDRROOT)/$(ARCH) -I$(HDDRROOT)/protocol -I/usr/include/efi/aarch64
CRTOBJS = $(EFIROOT)/lib/crt0-efi-$(ARCH).o
CFLAGS = -O2 -fPIC -Wall -fshort-wchar -fno-strict-aliasing -fno-merge-constants
#CFLAGS = -O2 -fPIC -Wall -fshort-wchar -fno-strict-aliasing -fno-merge-constants -mno-red-zone
ifeq ($(ARCH),x86_64)
CFLAGS += -DEFI_FUNCTION_WRAPPER
endif
CPPFLAGS = -DCONFIG_$(ARCH)
#FORMAT = efi-app-$(ARCH)
FORMAT = elf64-aarch64
INSTALL = install
LDFLAGS = -nostdlib
LDSCRIPT = $(EFIROOT)/lib/elf_$(ARCH)_efi.lds
LDFLAGS += -T $(LDSCRIPT) -shared -Bsymbolic -L$(EFIROOT)/lib $(CRTOBJS)
LOADLIBS = -lefi -lgnuefi $(shell $(CC) -print-libgcc-file-name)
prefix =
CC = $(prefix)gcc
AS = $(prefix)as
LD = $(prefix)ld
AR = $(prefix)ar
RANLIB = $(prefix)ranlib
#OBJCOPY = $(prefix)objcopy
OBJCOPY = llvm-objcopy-10
%.efi: %.so
$(OBJCOPY) -j .text -j .sdata -j .data -j .dynamic -j .dynsym -j .dynstr -j .rel \
-j .rela -j .reloc --target=$(FORMAT) $*.so $@
%.so: %.o
$(LD) $(LDFLAGS) $^ -o $@ $(LOADLIBS)
%.o: %.c
$(CC) $(INCLUDES) $(CFLAGS) $(CPPFLAGS) -c $< -o $@
TARGETS = hello.efi
all: $(TARGETS)
clean:
rm -f $(TARGETS)
これで、hello.cを書いてmakeコマンドを実行します。
そうすると、次のようにhello.efiバイナリファイルが出来上がります。
~/document/src/uefi-app$ ls -l
total 132
-rw-rw-r-- 1 takahiro takahiro 1258 3月 4 14:33 Makefile
-rw-rw-r-- 1 takahiro takahiro 200 3月 4 13:40 hello.c
-rwxrwxr-x 1 takahiro takahiro 124072 3月 4 14:33 hello.efi