以下 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 功能可能很重要。