我如何 Link 目标文件进入 UEFI DXE/EFI 驱动程序?
How Do I Link An Object File Into a UEFI DXE/EFI Driver?
我正在构建一个 UEFI DXE/EFI (UDK2018) 驱动程序(在 Windows,使用 VS2017),我需要向其中 link 现有对象 (.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
驱动程序的 =77=] 成功。)
没有 .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
文件,但如果我要这样做,还有其他更直接的选项对我的情况有意义。使用独立的目标文件会更可取、更简单,并且与更大项目的其他部分更协作,上面的例子似乎表明这应该是可能的。
谁能告诉我如何将预先存在的目标文件 link 放入 DXE/EFI(大概是通过将其添加到 object_files.lst
)?
好吧,我本该想到经过几天的尝试,答案会在我发布这个问题后立即出现...确实如此。
我首先被定向到默认的 EDK\Conf\build_rule.txt
文件,然后在那里查看,我找到了 .obj
文件的构建规则(以及.o
个文件)!这看起来很像一个普通副本(好吧,实际上是将它添加到与 .c
/.cpp
/.asm
/etc. 文件的输出相同的列表中),所以提出了这个想法尝试将 .obj
文件放入 [Sources]
部分。我在其他任何地方都没有看到过,所以我尝试了一下,果然有效:
[Sources]
SampleDXE.c
SampleDXE.h
SampleProtocol.h
path/to/my/file.obj
我正在构建一个 UEFI DXE/EFI (UDK2018) 驱动程序(在 Windows,使用 VS2017),我需要向其中 link 现有对象 (.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
驱动程序的 =77=] 成功。)
没有 .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
文件,但如果我要这样做,还有其他更直接的选项对我的情况有意义。使用独立的目标文件会更可取、更简单,并且与更大项目的其他部分更协作,上面的例子似乎表明这应该是可能的。
谁能告诉我如何将预先存在的目标文件 link 放入 DXE/EFI(大概是通过将其添加到 object_files.lst
)?
好吧,我本该想到经过几天的尝试,答案会在我发布这个问题后立即出现...确实如此。
我首先被定向到默认的 EDK\Conf\build_rule.txt
文件,然后在那里查看,我找到了 .obj
文件的构建规则(以及.o
个文件)!这看起来很像一个普通副本(好吧,实际上是将它添加到与 .c
/.cpp
/.asm
/etc. 文件的输出相同的列表中),所以提出了这个想法尝试将 .obj
文件放入 [Sources]
部分。我在其他任何地方都没有看到过,所以我尝试了一下,果然有效:
[Sources]
SampleDXE.c
SampleDXE.h
SampleProtocol.h
path/to/my/file.obj