我正在构建一个 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(大概是通过将它添加到 DXE/EFI 中object_files.lst
)?