1

以下 makefile 片段似乎是用于将文件objcopy转换为文件的命令行选项。.so.efi

OBJCOPYFLAGS = \
    -j .text\
    -j .sdata\
    -j .data\
    -j .dynamic\
    -j .dynsym\
    -j .rel\
    -j .rela\
    -j .reloc\
    --target=efi-app-$(TARGET)   <=====HERE

它基本上从文件中提取某些部分.so并进入efi-app目标。

但是当我objcopy --info用来查看所有支持的输出文件格式(见下文)时,没有efi-app类型。

在此处输入图像描述

那么如何制作objcopy支持efi-app输出格式呢?

加 1

找到相关链接: https ://forums.gentoo.org/viewtopic-p-7197314.html

看来我需要考虑 Gentoo Linux 发行版和gnu-efi项目。

在链接断开的情况下添加下面的报价。

问题:

我对学习如何创建 UEFI 应用程序很感兴趣。我安装了 gnu-efi ebuild,在自述文件中发现 objcopy 需要支持 efi-app-x86_64。当我执行 objcopy --help 时,没有提及 efi-app-x86_64。我尝试添加多目标使用标志,但没有成功。我想知道是否有人知道如何获得支持 efi 的工具链,或者是否有任何关于使用 gentoo/linux 构建 efi 应用程序的 goosd 教程(我一直找不到)。

回答:

首先,Gentoo 的 GNU-EFI 是 3.0i 版本,非常旧(2009 年 9 月)。当前版本是 3.0s,尽管在我的测试中它运行得不是很好(二进制文件无法执行)。3.0r 版对我来说很好,所以你可能想尝试从它的 Sourceforge 页面下载它并在本地安装它。FWIW,我在今年 4 月提交了一份错误报告,要求进行版本升级,但没有得到任何官方行动,尽管此错误报告包含指向本地 ebuild 的链接。

至于您的主要问题,我的 objcopy 也没有将 efi-app-x86_64 显示为目标,但它确实有效。这是我得到的支持目标:

代码:

objcopy: supported targets: elf64-x86-64 elf32-i386 elf32-x86-64 a.out-i386-linux pei-i386 pei-x86-64 elf64-l1om elf64-k1om elf64-little elf64-big elf32-little elf32-big plugin srec symbolsrec verilog tekhex binary ihex

当我使用 GNU-EFI 编译我的 rEFInd 时,我在 make 输出中得到以下(以及许多其他消息):

代码:

/usr/bin/objcopy -j .text -j .sdata -j .data -j .dynamic -j .dynsym -j .rel \
      -j .rela -j .reloc --target=efi-app-x86_64 refind_x64.so refind_x64.efi

这不会产生任何错误,实际上二进制文件可以正常工作。

所以底线是:不要担心它,除非它给你带来问题。如果是这种情况,请发回详细信息。

还有一点:可以使用 TianoCore EDK2 而不是 GNU-EFI 编译 EFI 应用程序。TianoCore 是一个完整的 EFI 实现,因此仅编译 EFI 应用程序有点矫枉过正,但它可以完成这项工作。它还有一个奇怪的(按 Linux 标准)编译过程,这可能会使从 Linux 安装和使用变得很尴尬。大多数为 Linux 用户开发的 EFI 程序,例如新的 Shim 安全工具和 gummiboot 引导加载程序,都使用 GNU-EFI,并且无法使用 TianoCore 进行编译。OTOH,TianoCore 比 GNU-EFI 更新得多,如果您想编译使用 TianoCore 或其前身开发工具包开发的东西,例如 EFI shell 程序,它是更好的选择。一些工具,例如 rEFInd,可以以任何一种方式编译。(重新搜索' 但是,启动 BIOS/传统引导加载程序的能力取决于 TianoCore 功能;如果您使用 GNU-EFI 编译 rEFInd,则无法启动 BIOS/旧版引导加载程序。)您可以查看 rEFInd 的 BUILDING.txt 和 Makefiles 以了解如何以更类似于 Linux/Unix 的方式使用 TianoCore。最后,哪个工具最好可能取决于您要编译的内容(哪个特定的现有程序或您从头开始编写的您自己的程序)。如果您正在编写一个新程序,那么了解您想要使用的 EFI 功能可能很重要。哪个工具最好可能取决于您要编译的内容(哪个特定的现有程序或您从头开始编写的您自己的程序)。如果您正在编写一个新程序,那么了解您想要使用的 EFI 功能可能很重要。哪个工具最好可能取决于您要编译的内容(哪个特定的现有程序或您从头开始编写的您自己的程序)。如果您正在编写一个新程序,那么了解您想要使用的 EFI 功能可能很重要。

4

1 回答 1

1

我最近一直在研究生成 64 位 UEFI 应用程序。根据我收集的信息,efi-app-x86_64binutils 将其翻译为pei-x86-64. 所以我假设efi-app被翻译成pei-i386.

不幸的是,这似乎没有记录在任何地方。邮件列表帖子给了我线索:https ://sourceware.org/legacy-ml/binutils/2018-12/msg00109.html

于 2021-07-02T02:17:27.863 回答