Jetson Nano(Raspberry Pi (arm64))でUEFIアプリケーション

※この記事の動作はまだ未確認です。

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

コメントをどうぞ

メールアドレスが公開されることはありません。 が付いている欄は必須項目です