交叉编译为UEFI可执行格式

编写完源代码之后,我们需要将它编译成UEFI可以执行的PE32+12格式。由于Linux的可执行文件为ELF格式,这里我们需要进行交叉编译。

在交叉编译之前,我们需要安装相对应的交叉编译器gcc-mingw-w64-x86-64

$ sudo apt install gcc-mingw-w64-x86-64

安装完成后,使用下面的命令进行编译:

$ x86_64-w64-mingw32-gcc -Wall -Wextra -e efi_main -nostdinc -nostdlib \
        -fno-builtin -Wl,--subsystem,10 -o main.efi main.c

参数-e用于指定程序入口点,这里我们指定为efi_main,这意味着程序将从efi_main函数开始运行。另外,参数--subsystem,10告诉编译器将生成的可执行文件类型设置为UEFI应用程序。得到的main.efi就是PE32+格式的UEFI可执行文件。

此外,其他能够编译成UEFI应用程序类型的PE32+格式可执行文件的方法也是可以的。例如使用Windows上的x86_64-w64-mingw32-gcc3

使用Makefile自动编译

示例代码中包括了Makefile文件。我们只需要进入各个例子的目录中,执行make命令,就可以轻松的完成编译。

$ cd ubmp-cn-code/baremetal/<各个例子的目录>
$ make

编译得到的可执行文件位于各个例子的目录下。4

1

这是Windows的可执行文件格式

2

译者注:PE32+为64位Windows的可执行文件格式,32位的为PE32

3

参考资料:Windows(64ビット環境)でvimprocをコンパイルしてみよう(在64位Windows环境下编译vimproc/日语)

4

译者注:这里介绍的是中文版示例代码的Makefile,日文版编译得到的可执行文件位于./fs/EFI/BOOT/BOOTX64.EFI