TalismanChet
@TalismanChet
Лицо зла

Почему не собирается EFI application?

Я написал простой "загрузчик" на Си для 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
  • Вопрос задан
  • 121 просмотр
Решения вопроса 1
TalismanChet
@TalismanChet Автор вопроса
Лицо зла
Я решил проблему. Мне пришлось изменить отн. путь к заголовкам в коде наа абсолютные, в целом, все. Вот итоговый Makefile:

arch = x86_64
cc = gcc
ld = ld
oc = objcopy

prefix = /home/vano/desktop/efildr

incl = $(prefix)/inc
lib1 = /usr/lib
lib2 = $(prefix)/lib
lib3 = $(prefix)/gnuefi
crt0 = $(prefix)/gnuefi

cflags = -fshort-wchar -I$(inc) -I$(inc)/$(arch) -I/usr/include -O2 -Wall -fpic -DEFI_FUNCTION_WRAPPER -ffreestanding -nostdlib -c

crtobj = $(crt0)/crt0-efi-$(arch).o
ldsobj = $(crt0)/elf_$(arch)_efi.lds

lflags = -T$(ldsobj) -shared -Bsymbolic -L$(lib1) -L$(lib2) -L$(lib3) $(crtobj) -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 $@
#
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
пишет, что не может найти "efi.h", хотя он есть в папке inc из Makefile

что такое "папка inc из Makefile"? Если ты имеешь в виду переменную inc определённую в 7й строке, то ты её нигде не использовал, а сами по себе переменные с произвольными именами в 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: Нет такого файла или каталога

смотри: нигде в списке -I ты не указал своего каталога inc, как по-твоему компилятор должен понять, что efi.h нужно там искать?

-I$(EFIINC)

В твоём Makefile не определена переменная EFIINC, откуда ты ожидаешь что она возьмётся?

Судя по содержимому Makefile стоит заменить имя inc на EFIINC, lib на EFILIB, crtobj на CRTOBJ и т. д.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы