如何将对象文件链接到 UEFI DXE/EFI 驱动程序?



我正在构建一个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(?

好吧,我应该想,经过几天的尝试,答案会在我发布这个问题后出现......它确实做到了。

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

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

最新更新