UEFI入门(二):edk2项目编译流程
- 一、Build流程框架
- Build的三个阶段:
- 1、Autogen
- 2、Make
- 3、ImageGen
- 二、编译构建步骤:
- 1. 安装依赖工具
- 2. 初始化构建环境
- 3. 配置工具链和目标
- 4. 定义平台配置
- 5. 构建并编译
- 三、uefi-tools编译edk2实践:
- 1. 克隆EDK2 项目
- 2. 构建并编译
- 参考文章:
一、Build流程框架
Build的三个阶段:
1、Autogen
解析meta-data文件,dsc文件,.inf文件,.fdf文件,.dec文件,生成Autogen.c 、Autougen.h 、.depex、 Makefiles等文件
2、Make
主要是来处理source文件并通过Make生成符合EFI格式的PE32/PE32+/COFF 文件。
3、ImageGen
主要是来处理binary文件和EFI格式的文件,产生最终的UEFI Flash Images, Capsules,Applications和PCI Option ROMs
二、编译构建步骤:
1. 安装依赖工具
在开始编译之前,需要确保所有依赖工具已经安装并配置好,主要包括:
1)编译工具链(如 GCC、Clang、MSVC、ARMCC 等)
2)构建工具(如 BaseTools 中的 GenFds、GenFw 等工具)
3)Python(用于运行构建脚本)
4)NASM(汇编器)
2. 初始化构建环境
通过运行 edksetup.sh 或 edksetup.bat(视操作系统而定)来初始化构建环境。
3. 配置工具链和目标
在 Conf 目录中配置构建参数。主要的配置文件包括:
1)target.txt:定义构建目标模式(DEBUG、RELEASE)、工具链标签(如 GCC5、VS2019 等)、目标架构(如 X64、IA32、AARCH64 等)。
2)tools_def.txt:定义每种工具链的路径和编译选项。
3)build_rule.txt:定义如何编译和链接各个文件类型。
4. 定义平台配置
每个平台有其对应的 .dsc 文件(平台描述文件)和 .fdf 文件(固件描述文件),用来定义要构建的平台、所包含的模块、库、驱动程序,以及固件映像的布局。.dsc 文件是编译每个模块的主要参考,而 .fdf 文件是生成固件映像时的重要文件。
5. 构建并编译
使用 build 命令来启动构建过程。该命令会读取 target.txt 和 .dsc 文件中的配置信息,调用相应的编译器和工具链来构建模块。
在构建过程中,build.py 脚本会执行以下步骤:
1)解析配置文件:解析 .dsc 文件中的平台配置和模块定义,确定需要编译的模块和库
2)依赖分析:分析模块之间的依赖关系,确保各个模块按正确的顺序编译
3)编译源码:根据工具链配置调用编译器(如 gcc、clang 等)编译源文件(.c、.cpp、.asm 等),生成目标文件(.obj)
4)链接生成模块:将生成的目标文件通过链接器(如 ld、link 等)链接为可执行的二进制文件(如 .efi 文件)
5)生成固件映像:根据 .fdf 文件定义的固件布局,使用 GenFds 工具将各个二进制模块打包成固件映像文件(如 .fd、.rom、.bin 等)。生成的映像文件通常位于 Build/ 目录中,常见的格式有:
.fd:Firmware Descriptor(固件描述文件),是完整的固件映像文件。
.rom:BIOS ROM 文件。
.bin:可执行的固件映像文件。
三、uefi-tools编译edk2实践:
使用 uefi-tools 编译 UEFI 固件的流程与传统的 EDK2 构建有所不同,它通过封装更简化了编译过程。
1. 克隆EDK2 项目
git clone https://github.com/tianocore/edk2.git
然后,进入 EDK2 目录并获取所需的子模块:
cd edk2
git submodule update --init
2. 构建并编译
../uefi-tools/edk2-build.sh -p MyPlatformPkg/MyPlatformPkg.dsc -a X64 -t GCC5 -b DEBUG
-p:指定平台描述文件路径。
-a:指定目标架构(如 X64、IA32)。
-t:指定工具链标签。
-b:指定构建模式(DEBUG 或 RELEASE)。
参考文章:
UEFI中的edk2编译流程_edk2代码走读
【UEFI实战】EDK的编译流程说明
EDK2 Build Flow
EDK II编译过程