Я написал простой "загрузчик" на Си для EFI, но он отказывается собираться.
код загрузчика:
#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 = x86_64 # $(shell uname -m | sed s,i[3456789]86,ia32,)
prefix = # /usr/bin/x86_64-pc-linux-gnu-
cc = $(prefix)gcc
ld = $(prefix)ld
oc = $(prefix)objcopy
inc = /usr/include/efi
lib = /usr/lib
crt = ./gnuefi
cflags = -fshort-wchar -I$(EFIINC) -I$(EFIINC)/$(ARCH) -I/usr/include -O2 -Wall -fpic -DEFI_FUNCTION_WRAPPER -ffreestanding -nostdlib -c
crtobj = $(crt)/crt0-efi-$(arch).o
ldsobj = $(crt)/elf_$(arch)_efi.lds
lflags = -T$(LDSCRIPT) -shared -Bsymbolic -L$(EFILIB) $(CRTOBJS) -nostdlib -znocombreloc
lodlib = -lefi -lgnuefi $(shell $(cc) -print-libgcc-file-name)
format = efi-app-$(arch)
%.efi: %.so
$(oc) -j .text -j .sdata -j .data -j .dynamic -j .dynsym -j .rel -j .rela -j .reloc --target=$(format) $^ $@
%.so: %.o
$(ld) $(lflags) $^ -o $@ $(lodlib)
%.o: %.c
$(cc) $(cflags) $^ -o $@
%.o: %.S
$(cc) $(cflags) $^ -o $@
#
пишет, что не может найти "efi.h", хотя он есть в папке inc из Makefile, так что проблем быть не должно:
gcc -fshort-wchar -I -I/ -I/usr/include -O2 -Wall -fpic -DEFI_FUNCTION_WRAPPER -ffreestanding -nostdlib -c main.c -o main.o
main.c:1:10: фатальная ошибка: efi.h: Нет такого файла или каталога
1 | #include <efi.h>
| ^~~~~~~
компиляция прервана.
make: *** [Makefile:29: main.o] Ошибка 1