Как связать объектный файл с драйвером UEFI DXE / EFI? - PullRequest
1 голос
/ 08 октября 2019

Я создаю драйвер 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)?

1 Ответ

1 голос
/ 08 октября 2019

Ну, я должен был подумать, что после нескольких дней попыток ответ появится сразу после того, как я разместил этот вопрос ... и он появился.

Сначала меня перенаправили на значение по умолчанию *Файл 1004 * и, просмотрев его, я нашел правило сборки для файлов .obj (а также файлов .o)! Это выглядело как обычная копия (ну, на самом деле, добавление ее в тот же список, что и вывод файлов .c / .cpp / .asm / и т. Д.), Поэтому была предложена идея поместить .obj файл в раздел [Sources]. Я не видел этого нигде больше, поэтому я попытался, и, конечно, это сработало:

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