diff options
-rw-r--r-- | GNU_efi_HelloWorld/.gitignore | 1 | ||||
-rw-r--r-- | GNU_efi_HelloWorld/Makefile | 9 | ||||
-rw-r--r-- | GNU_efi_HelloWorld/hello.c | 1 | ||||
-rwxr-xr-x | GNU_efi_HelloWorld/hello.efi | bin | 0 -> 45555 bytes | |||
-rw-r--r-- | GNU_efi_HelloWorld/hello.o | bin | 1696 -> 1664 bytes | |||
-rwxr-xr-x | GNU_efi_HelloWorld/hello.so | bin | 0 -> 2170968 bytes | |||
-rw-r--r-- | documentation/GNU-efi | 111 | ||||
-rw-r--r-- | test_code/OVMF_VARS.fd | bin | 540672 -> 540672 bytes |
8 files changed, 112 insertions, 10 deletions
diff --git a/GNU_efi_HelloWorld/.gitignore b/GNU_efi_HelloWorld/.gitignore new file mode 100644 index 0000000..ca4663b --- /dev/null +++ b/GNU_efi_HelloWorld/.gitignore @@ -0,0 +1 @@ +gnu-efi diff --git a/GNU_efi_HelloWorld/Makefile b/GNU_efi_HelloWorld/Makefile index 4f00d4a..31195ee 100644 --- a/GNU_efi_HelloWorld/Makefile +++ b/GNU_efi_HelloWorld/Makefile @@ -1,12 +1,11 @@ ARCH = $(shell uname -m | sed s,i[3456789]86,ia32,) -OBJS = main.o +OBJS = hello.o TARGET = hello.efi EFIINC = /usr/include/efi -EFFINCS = -I$(EFFINC) -I$(EFIINC)/$(ARCH) -I$(EFIINC)/protocol -LIB = /usr/lib64 -EFILIB = /usr/lib64/gnuefi +EFFINCS = -I$(EFIINC) -I$(EFIINC)/$(ARCH) -I$(EFIINC)/protocol +EFILIB = /usr/lib EFI_CRT_OBJS = $(EFILIB)/crt0-efi-$(ARCH).o EFI_LDS = $(EFILIB)/elf_$(ARCH)_efi.lds @@ -18,7 +17,7 @@ ifeq ($(ARCH),x86_64) endif LDFLAGS = -nostdlib -znocombreloc -T $(EFI_LDS) -shared \ - -Bsymbolic -L $(EFILIB) -L $(LIB) $(EFI_CRT_OBJS) + -Bsymbolic -L $(EFILIB) $(EFI_CRT_OBJS) all: $(TARGET) diff --git a/GNU_efi_HelloWorld/hello.c b/GNU_efi_HelloWorld/hello.c index 26cbd42..52c05b3 100644 --- a/GNU_efi_HelloWorld/hello.c +++ b/GNU_efi_HelloWorld/hello.c @@ -4,6 +4,7 @@ EFI_STATUS EFIAPI efi_main (EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable) { + InitializeLib(ImageHandle, SystemTable); Print(L"Hello, world!\n"); diff --git a/GNU_efi_HelloWorld/hello.efi b/GNU_efi_HelloWorld/hello.efi Binary files differnew file mode 100755 index 0000000..27145e5 --- /dev/null +++ b/GNU_efi_HelloWorld/hello.efi diff --git a/GNU_efi_HelloWorld/hello.o b/GNU_efi_HelloWorld/hello.o Binary files differindex 6e14a71..22a8362 100644 --- a/GNU_efi_HelloWorld/hello.o +++ b/GNU_efi_HelloWorld/hello.o diff --git a/GNU_efi_HelloWorld/hello.so b/GNU_efi_HelloWorld/hello.so Binary files differnew file mode 100755 index 0000000..bc418e3 --- /dev/null +++ b/GNU_efi_HelloWorld/hello.so diff --git a/documentation/GNU-efi b/documentation/GNU-efi index 7fb0f1f..8dddc4a 100644 --- a/documentation/GNU-efi +++ b/documentation/GNU-efi @@ -1,5 +1,106 @@ -################################################################## -## ## -## BUILDING HELLOWORLD.EFI WIH GNU-EFI ## -## ## -################################################################## +################################################################################## +## ## +## BUILDING HELLOWORLD.EFI WIH GNU-EFI ## +## ## +################################################################################## + +################################################################################# +# SUMMARY # +################################################################################# + +Minimal working example: + + hello.c +--------------------------------------------------------------------------------- +#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 = $(shell uname -m | sed s,i[3456789]86,ia32,) + +OBJS = hello.o +TARGET = hello.efi + +EFIINC = /usr/include/efi +EFFINCS = -I$(EFIINC) -I$(EFIINC)/$(ARCH) -I$(EFIINC)/protocol +EFILIB = /usr/lib +EFI_CRT_OBJS = $(EFILIB)/crt0-efi-$(ARCH).o +EFI_LDS = $(EFILIB)/elf_$(ARCH)_efi.lds + +CFLAGS = $(EFFINCS) -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) $(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) $^ $@ + + + + +################################################################################# +# https://wiki.osdev.org/GNU-EFI # +################################################################################# + +GNU-EFI is a very lightweight developing environment to create UEFI applications. +It is a set of libraries and headers for compiling UEFI applications with a +system's native GCC. + +You can use host native compiler, then convert resulting ELF into UEFI-compatible +PE. + OR +Use GCC Cross-Compiler generating PE directly. + +********************************************************************************* +* $ git clone https://git.code.sf.net/p/gnu-efi/code gnu-efi * +* $ cd gnu-efi * +* $ make * +********************************************************************************* + +This should create +* crt0-efi-x86_64.o: + A CRT0 (C runtime initialization code) that will call the + "efi_main" function + +* libgnuefi.a: + A library containing a single function (_relocate) + that is used by the CRT0 + +* (optional) libefi.a: + A library containing convenience functions like CRC computation, string + length calculation, and easy text printing + +HEADERS can be used from: +* /usr/include/efi (updated to the latest) +* from EDK2 package +* Or from gnu-efi/inc + +LINKER SCRIPT: +* gnu-efi/gnuefi/elf_x86_64_efi.lds + OR +* /usr/lib/elf_x86_64_efi.lds + diff --git a/test_code/OVMF_VARS.fd b/test_code/OVMF_VARS.fd Binary files differindex a7fab53..9883b80 100644 --- a/test_code/OVMF_VARS.fd +++ b/test_code/OVMF_VARS.fd |