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

时间:2016-07-27 03:39:28

标签: gnu binutils objcopy

以下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类型。

enter image description here

那么如何使objcopy支持efi-app输出格式?

ADD 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。我尝试添加multitarget useflag   没运气。我想知道是否有人知道如何获得工具链   支持efi或者是否有任何goosd教程(我没有   能够找到任何关于使用gentoo / linux构建efi应用程序。

答案:

  

首先,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
  

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

     

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

     

还有一点:可以使用。编译EFI应用程序   TianoCore EDK2而不是GNU-EFI。 TianoCore是一个完整的EFI   实现,所以编译EFI应用程序太过分了,但是   它可以完成这项工作。它也有点奇怪(按Linux标准)   编译过程,这可能使安装和使用尴尬   Linux操作系统。大多数为Linux用户开发的EFI程序,例如新用户   Shim安全工具和gummiboot引导装载程序,使用GNU-EFI,但不会   用TianoCore编译。 OTOH,TianoCore比最新的更新   GNU-EFI,如果你想编译一些东西,它是更好的选择   与TianoCore或其前身开发套件一起开发,如   一个EFI shell程序。可以编译某些工具,例如rEFInd   无论哪种方式。 (rEFInd启动BIOS /传统启动加载器的能力取决于   但是,关于TianoCore的功能;你无法启动BIOS /传统启动   如果你用GNU-EFI编译rEFInd,那就是加载器。)你可以查看rEFInd   BUILDING.txt和Makefiles学习如何使用更多的TianoCore   Linux / Unix式的方式。最后,哪种工具最好可能依赖   你想要编译什么(哪个特定的现有程序或你自己的程序   你从头开始编写的程序。如果你正在写一个新的   程序,了解您想要使用的EFI功能   重要的。

1 个答案:

答案 0 :(得分: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