Step to UEFI (279)介绍一个最小的UEFI Application 编译器

最近接触到了 TinyCC (https://bellard.org/tcc/), 这是一个小巧的、开源、编译速度快的C编译器。

https://github.com/andreiw/tinycc/tree/mob 这里,有一个基于 TinyCC 支持编译UEFI Application的项目。这里介绍如何使用这个编译器编译生成 UEFI Shell Application。

第一步,下载上述代码。

第二步,生成 TinyCC  UEFI 编译器。下载的 Package 中只有源代码,没有二进制的 EXE ,所以需要先进行编译。我这边使用 VS2019 进行编译,进入源代码 Win32 目录下:

特别注意需要对 build-tcc.bat进行修改,其中的-DONE_SOURCE=0需要使用引号:

%CC% -o tcc.exe ..\tcc.c libtcc.dll %D% “-DONE_SOURCE=0”

运行 build-tcc.bat -c cl -t 64_ 命令:

生成的x86_64-win32-tcc.exe 就是我们需要的编译器:

第三步,在 EDK2 中编译生成一个 EFI Application。

  1. 拷贝 x86_64-win32-tcc.exe 到edk2-stable202308根目录下
  2. 将如下代码命名为 Hello.c
#include <Uefi.h>

CHAR16 *gHello = L"Hello from a TinyCC compiled UEFI binary!\r\n";

EFI_STATUS EFIAPI
_start(EFI_HANDLE Handle,
       EFI_SYSTEM_TABLE *SystemTable)
{
  SystemTable->ConOut->OutputString(SystemTable->ConOut, gHello);
  return EFI_SUCCESS;
}

3.直接打开一个 cmd 窗口(不需要 Vs2019)

4.编译命令如下

x86_64-win32-tcc -I MdePkg/Include -I MdePkg/Include/X64  hello.c  -Wl,-subsystem=efiapp -nostdlib -o efitest.x64.efi -DMDE_CPU_EBC

5.编译后直接生成 efitest.x64.efi

第四步,在模拟器中测试生成的 EFI 文件,可以看到能够正常工作。

本文提到的完整代码可以在下面下载:

《Step to UEFI (279)介绍一个最小的UEFI Application 编译器》有6个想法

  1. 編譯此範例可以成功但嘗試編譯以下網址的範例會出錯

    https://www.lab-z.com/getpidvid/

    In file included from GetPIDVID.c:2:
    In file included from MdePkg/Include/Library/UefiLib.h:36:
    MdePkg/Include/Library/BaseLib.h:73: error: incompatible redefinition of 'BASE_LIBRARY_JUMP_BUFFER'

      1. 我使用https://www.lab-z.com/stu284/ 下載的miniUEFI folder之後加入需要用的.h 檔後,
        一樣會出現BASE_LIBRARY_JUMP_BUFFER的error

          1. 這樣的話該如何修改?
            我是要在x64的shell執行GetPIDVID,
            我看現在包的ProcessorBind.h裡面是MDE_CPU_X64

          2. 这个需要你自己修改代码,让它使用正确的ProcessorBind.h了。暂时我也没有什么好办法。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注