最近接触到了 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。
- 拷贝 x86_64-win32-tcc.exe 到edk2-stable202308根目录下
- 将如下代码命名为 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 文件,可以看到能够正常工作。
本文提到的完整代码可以在下面下载:
編譯此範例可以成功但嘗試編譯以下網址的範例會出錯
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'
推荐你根据 https://www.lab-z.com/stu284/ 这个文章试试看?
我使用https://www.lab-z.com/stu284/ 下載的miniUEFI folder之後加入需要用的.h 檔後,
一樣會出現BASE_LIBRARY_JUMP_BUFFER的error
我猜测是因为没有include 正确的 ProcessorBind.h 导致的。
這樣的話該如何修改?
我是要在x64的shell執行GetPIDVID,
我看現在包的ProcessorBind.h裡面是MDE_CPU_X64
这个需要你自己修改代码,让它使用正确的ProcessorBind.h了。暂时我也没有什么好办法。