【问题标题】:How Do I Link An Object File Into a UEFI DXE/EFI Driver?如何将对象文件链接到 UEFI DXE/EFI 驱动程序?
【发布时间】:2020-02-06 02:24:17
【问题描述】:

我正在构建一个 UEFI DXE/EFI (UDK2018) 驱动程序(在 Windows 上,使用 VS2017),我需要将现有对象 (.obj) 文件链接到该驱动程序中。我相当肯定这应该从 INF 文件中完成,但我没有看到任何关于 EDK2 文档中包含目标文件的具体内容。我确实找到了这两个示例供参考:

https://github.com/tianocore/edk2/blob/UDK2018/StdLib/LibC/LibC.inf#L96

[Binaries.X64]
LIB|Twofish_x64.obj|*
LIB|Camellia_aesni_x64.obj|*
LIB|Camellia_x64.obj|*

https://github.com/veracrypt/VeraCrypt-DCS/blob/master/Library/VeraCryptLib/VeraCryptLib.inf#L79

[Binaries.IA32]
  LIB|Main/Ia32/ftol2.obj|*|MSFT

但是,即使将这些作为参考(我认为它有效),我也无法找出正确的方法来配置 INF 文件以获取 object_files.lst 包括.obj。 (实际错误当然是外部未解决。--我已经验证如果我手动将.obj文件添加到object_files.lst.efi驱动的链接成功.)

没有.obj,我的INF看起来像这样:

[Defines]
  INF_VERSION                    = 0x00010005
  BASE_NAME                      = SampleDxe
  FILE_GUID                      = XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
  MODULE_TYPE                    = DXE_DRIVER
  VERSION_STRING                 = 1.0
  ENTRY_POINT                    = SampleDxe_Main

[Sources]
  SampleDXE.c
  SampleDXE.h
  SampleProtocol.h

[Packages]
  MdePkg/MdePkg.dec
  MdeModulePkg/MdeModulePkg.dec

[LibraryClasses]
  UefiBootServicesTableLib
  MemoryAllocationLib
  UefiDriverEntryPoint
  BaseMemoryLib
  UefiLib
  DebugLib
  BaseLib
  PcdLib
  DevicePathLib

[Depex]
  TRUE

我尝试在[Sources][Packages] 部分之间插入以下部分,但没有成功:

[Binaries]
  LIB|path/to/my/file.obj|*|MSFT
[Binaries.X64]
  LIB|path/to/my/file.obj|*|MSFT
[Binaries]
  LIB|path/to/my/file.obj|*
[Binaries.X64]
  LIB|path/to/my/file.obj|*
[Binaries]
  LIB|path/to/my/file.obj
[Binaries.X64]
  LIB|path/to/my/file.obj

(.obj与源文件放在一起)

[Binaries]
  LIB|file.obj|*|MSFT
[Binaries.X64]
  LIB|file.obj|*|MSFT
[Binaries]
  LIB|file.obj|*
[Binaries.X64]
  LIB|file.obj|*
[Binaries]
  LIB|file.obj
[Binaries.X64]
  LIB|file.obj

我也将 INF_VERSION 修改为更高版本(0x0001001A、1.25 等),尽管并非上述部分的所有组合。

我也相信我可以创建一个中间 .lib 文件,但如果我要这样做,还有其他更直接的选项对我来说是有意义的。使用独立的目标文件会更好,更简单,并且与更大项目的其他部分更合作,上面的例子肯定表明这应该是可能的。

谁能告诉我如何让一个预先存在的目标文件链接到 DXE/EFI(大概是通过将它添加到 object_files.lst)?

【问题讨论】:

    标签: linker .obj uefi object-files edk2


    【解决方案1】:

    嗯,我应该想到,经过几天的尝试,答案会在我发布这个问题之后出现......而且确实如此。

    我首先被定向到默认的 EDK\Conf\build_rule.txt 文件,然后查看那里,我找到了 .obj 文件(以及 .o 文件)的构建规则!这看起来很像一个普通的副本(嗯,实际上将它添加到与.c/.cpp/.asm/etc. 文件的输出相同的列表中),所以建议尝试放置@987654327 @ 文件到 [Sources] 部分。我在其他任何地方都没有看到过,所以我尝试了,果然,它奏效了:

    [Sources]
      SampleDXE.c
      SampleDXE.h
      SampleProtocol.h
      path/to/my/file.obj
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-01
      • 2015-10-09
      • 2016-11-29
      • 2021-09-19
      • 2016-11-11
      • 2016-06-02
      • 2023-03-13
      • 2018-02-09
      相关资源
      最近更新 更多