如何使 `objcopy` 支持 efi-app 目标?

Posted

技术标签:

【中文标题】如何使 `objcopy` 支持 efi-app 目标?【英文标题】:How to make `objcopy` support efi-app target? 【发布时间】:2016-07-27 03:39:27 【问题描述】:

下面的makefile sn -p 似乎用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或者有没有goosd教程(我没去过 能够找到任何关于使用 gentoo/linux 构建 efi 应用程序的信息。

答案:

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

至于你的主要问题,我的 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。 TianoCore 是一个完整的 EFI 实现,所以只编译 EFI 应用程序就有点过头了,但是 它可以完成这项工作。它也有一个奇怪的(按 Linux 标准) 编译过程,这可能会使安装和使用变得尴尬 Linux。大多数为 Linux 用户开发的 EFI 程序,例如新的 Shim 安全工具和 gummiboot 引导加载程序,使用 GNU-EFI 并且不会 用 TianoCore 编译。 OTOH,TianoCore 比 GNU-EFI,如果你想编译一些东西,它是更好的选择 使用 TianoCore 或其前身开发套件开发,例如 一个 EFI 外壳程序。可以编译一些工具,例如 rEFInd 无论哪种方式。 (rEFInd 引导 Bios/传统引导加载程序的能力取决于 不过,关于 TianoCore 功能;您无法启动 BIOS/旧版启动 如果您使用 GNU-EFI 编译 rEFInd,则加载程序。)您可以查看 rEFInd 的 BUILDING.txt 和 Makefiles 来学习如何使用 TianoCore 类似 Linux/Unix 的方式。最后,哪种工具最好可能取决于 你想编译什么(哪个特定的现有程序或你自己的 您从头开始编写的程序)。如果你正在写一个新的 程序,了解您要使用的 EFI 功能可能是 很重要。

【问题讨论】:

【参考方案1】:

我最近一直在研究生成 64 位 UEFI 应用程序。据我所知,efi-app-x86_64 被 binutils 翻译成pei-x86-64。所以我假设efi-app 被翻译成pei-i386

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

【讨论】:

以上是关于如何使 `objcopy` 支持 efi-app 目标?的主要内容,如果未能解决你的问题,请参考以下文章

如何从填充部分停止 objcopy

如何避免 objcopy 炸毁文件?

Objcopy,它如何进行二进制输出?

如何使用 OBJCOPY 的 --add-section 开关?

如何在 cmake 中使用 self ld、objcopy 和 ar?

如何使用objcopy或libelf将elf文件的一部分替换为另一部分,以便将其加载到内存中?