【问题标题】:How to compile uefi application using gnu-efi?如何使用 gnu-efi 编译 uefi 应用程序?
【发布时间】:2015-10-09 11:30:24
【问题描述】:

我尝试使用gnu-efi 编译 uefi 代码。但是我不明白如何编译我的 uefi 应用程序代码。

我得到gnu-efi 3.0.2,解压缩并输入make && make install。我写 hello world 代码:

#include <efi.h>
#include <efilib.h>

EFI_STATUS efi_main (EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable) {
    InitializeLib(ImageHandle, SystemTable);
    Print(L"Hello, world!\n");

    return EFI_SUCCESS;
}

我的操作系统是 Ubuntu 15.04。

【问题讨论】:

    标签: uefi gnu-efi


    【解决方案1】:
    1. 包括 gnu-efi 文件

      #include <efi.h> 
      #include <efilib.h>
      

      看起来你的包含被 SO 删除了

    2. 创建make文件;

    如果您在 Linux 中为 Linux 构建“Hello, World”程序 环境,你可以在没有 Makefile 的情况下编译它。建设 但是,Linux 中的 EFI 程序本质上是一个交叉编译 手术。因此,它需要使用不寻常的编译和 链接器选项,以及一个链接后操作来转换 编程为 EFI 将接受的形式。虽然你可以输入 手动完成所有相关命令,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
    LIB             = /usr/lib64
    EFILIB          = /usr/lib64/gnuefi
    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 $@ -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) $^ $@
    

    参考:

    http://www.rodsbooks.com/efi-programming/hello.html

    【讨论】:

    • @Thecoffee17thcup 你能告诉我如何在 Ubuntu 中构建它吗?我一直有“致命错误:efi.h:没有这样的文件或目录”
    • 这很简单。您的编译器看不到efi.h,请检查您的make 文件; EFIINC = /usr/include/efi 应该指向所需的 gnu-efi 头文件。
    • -fpic 是干什么用的?
    • 位置无关代码读取wiki.gentoo.org/wiki/Project:AMD64/…
    【解决方案2】:

    在 Ubuntu 18.04 中,这两行代码:

    LIB             = /usr/lib64
    
    EFILIB          = /usr/lib64/gnuefi
    

    需要改成:

    LIB             = /usr/lib
    
    EFILIB          = /usr/lib
    

    【讨论】:

      猜你喜欢
      • 2019-04-04
      • 2021-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-06
      • 1970-01-01
      • 2021-07-14
      相关资源
      最近更新 更多