惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Threat Research - Cisco Blogs
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
V
Vulnerabilities – Threatpost
GbyAI
GbyAI
P
Proofpoint News Feed
L
LINUX DO - 热门话题
P
Palo Alto Networks Blog
A
About on SuperTechFans
T
Tenable Blog
M
MIT News - Artificial intelligence
IT之家
IT之家
I
Intezer
D
DataBreaches.Net
爱范儿
爱范儿
T
Threatpost
C
CERT Recently Published Vulnerability Notes
云风的 BLOG
云风的 BLOG
博客园 - 三生石上(FineUI控件)
WordPress大学
WordPress大学
K
Kaspersky official blog
大猫的无限游戏
大猫的无限游戏
A
Arctic Wolf
Y
Y Combinator Blog
Cyberwarzone
Cyberwarzone
酷 壳 – CoolShell
酷 壳 – CoolShell
D
Darknet – Hacking Tools, Hacker News & Cyber Security
H
Help Net Security
Microsoft Security Blog
Microsoft Security Blog
Spread Privacy
Spread Privacy
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
AWS News Blog
AWS News Blog
博客园 - 聂微东
C
Check Point Blog
S
Securelist
有赞技术团队
有赞技术团队
雷峰网
雷峰网
aimingoo的专栏
aimingoo的专栏
Last Week in AI
Last Week in AI
Stack Overflow Blog
Stack Overflow Blog
MongoDB | Blog
MongoDB | Blog
D
Docker
G
GRAHAM CLULEY
T
The Exploit Database - CXSecurity.com
C
Cybersecurity and Infrastructure Security Agency CISA
T
Tailwind CSS Blog
L
Lohrmann on Cybersecurity
G
Google Developers Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
L
LangChain Blog

博客园 - yooooooo

【ARM CoreLink 系列 5 -- CI-700 控制器介绍 】 ARM CoreLink 系列 4.3 -- NI-700 Component and interface identifiers ARM CCI-500 与 NI0700 的关系. ARM NIC-400 与 NI-700 的区别 claude code命令使用 【ARM Trace32(劳特巴赫) 使用介绍 2.2 -- TRACE32 进阶命令之 DIAG 弹框命令】 trace32 .cmm脚本和.t32文件的区别 【ARM Trace32(劳特巴赫) 使用介绍 2.1 -- TRACE32 Practice 脚本 cmm 脚本学习】 【ARM Trace32(劳特巴赫) 使用介绍 1.1 - Veloce 环境中使用trace32 连接 Cortex-M33】 PCIe 总线的 ASPM 和 链路状态机制总结 fw_devlink 功能 I3C协议详解 UART 协议规范 BPF 调度器 sched_ext 实现机制、调度流程及样例 Android Camera性能分析 录像Buffer Path详解 【UEFI基础】Protocol介绍 【UEFI实战】在库中使用全局变量 sched feature TTWU_QUEUE 【ARM CoreLink 系列 4.2 -- NI-700 Function units 详细介绍】 UEFI:FDF文件及FD、FV、FFS EDK II PCD的概念、类型、使用 PELT算法浅析 load_balance函数代码详解 - yooooooo UEFI Boot Manager Linux misfit task Linux 内核中sched_prio_to_weight转换关系 CFS任务放置代码详解 CFS任务的负载均衡(load balance)
edk2构建编译流程
yooooooo · 2025-11-23 · via 博客园 - yooooooo

一、Build流程框架

1

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 编译 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)。