2016-02-04 1 views
1

Моей средой является Ubuntu15.10. Я написал следующий исходный код.Скажите, пожалуйста, как запустить мое приложение UEFI на QEMU

#include "efi.h" 
#include "efilib.h" 

EFI_STATUS 
EFIAPI 
efi_main(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable) 
{ 
    InitializeLib(ImageHandle, SystemTable); 
    Print(L"HelloWorld\n"); 

    return EFI_SUCCESS; 
} 

Я написал следующий файл Makefile и скомпилировал исходный код.

ARCH = $(shell uname -m | sed s,i[3456789]86,ia32,) 
OBJS = main.o 
TARGET = hello.efi 

EFIINC = /usr/include/efi 
EFIINCS = -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 = $(EFIINCS) -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) -L $(LIB) $(EFI_CRT_OBJS) 
all: $(TARGET) 
hello.so:$(OBJS) 
    ld $(LDFLAGS) $(OBJS) -o [email protected] -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) $^ [email protected] 

хранить hello.efi на имя каталога RT и я бег "QEMU-систему-x86_64 -bios OVMF.fd -hda жира: RT /". Я запускаю hello.efi, но не выполняю мое приложение UEFI. Qemu говорит: «Сообщение об ошибке: Invalud Parameter».

Пожалуйста, помогите!

+0

Что вы основывая свой код приложения на? Вы пытались построить и запустить тестовые приложения gnu-efi? – unixsmurf

+0

Да. Эти тестовые приложения скомпилированы gnu-efi. –

+0

И вы, что я просил, пытались создать и запустить тестовые приложения, поставляемые с gnu-efi? – unixsmurf

ответ

1

Удаление -L $(LIB) из LDFLAGS в Makefile помогло:

+0

Не могли бы вы рассказать об изменениях? – mastov

+0

Нет. Я удаляю только «-L $ (LIB)». –

+0

Ну, это часть разработки, вы должны были написать это в ответ, иначе трудно понять, каково было изменение. И знаете ли вы, почему/как это изменение исправило проблему? – mastov

0

Вам не нужен 'main()' vs. 'efi_main()'?

+1

Нет, это GNU-EFI. efi + main правильно. – fpmurphy1

Смежные вопросы