UEFI开发环境搭建(踩坑指南)
参考内容
「Coding Tools」 第3话 Ubuntu下EDK2开发环境搭建 - 哔哩哔哩 (bilibili.com)
「Coding Tools」 第4话 如何使用Qemu虚拟机运行EDK2编译结果 - 哔哩哔哩 (bilibili.com)
《UEFI编程实践》- 罗冰 机械工业出版社
环境:
vmware 17
ubuntu 22.04(不建议使用20.04以下的环境)
1、 安装依赖工具
apt install python3 (建议使用python3不要使用python2)
apt install python3-distutils
apt install uuid-dev
apt install nasm(必须2.15及以上)
apt install bison
apt install flex
apt install iasl(不要使用acpica! 可能会导致编译OVMF镜像时路径错误)
2、 下载开发包
mkdir ~/UEFI
cd ~/UEFI
git clone http://github.com/tianocore/edk2.git
git clone http://github.com/tianocore/edk2-libc.git
3、 配置编译环境
cd edk2
git submodule update –init (此时会遭遇多次失败,不要怀疑自己,重复几次即可,使用科学上网有概率提高成功率)
make -C BaseTools (成功会提示OK)

新建脚本配置环境方便多次使用 vim initedk.sh 内容为:
cd $home/~/UEFI/edk2
export EDK_TOOLS_PATH=$home/~/UEFI/edk2/BaseTools
source edksetup.sh BaseTools
export PYTHON_COMMAND=/usr/bin/python3(若默认python环境为2可加此条,一般不用)
4、 编译UEFI模拟器
本文只编译64位模拟器,qemu及应用程序,若要编译32位程序使用命令-a IA32,目前遇到的问题是使用64位机器编译32位程序仍然会从64位的基础库中查找依赖,理论解决方法是将32位的依赖库添加一个硬链接(暂未解决)。
source initedk.sh
build -p edk2/EmulatorPkg/EmulatorPkg.dsc -t GCC5 -a X64
或者修改edk2/Conf目录下的target.txt


以done标志成功

编译完成后生成的文件在~ /UEFI/edk2/Build/EmulatorX64/DEBUG_GCC5/X64中
可执行文件./Host

5、 编译OVMF镜像及GDB调试
以MdeModulePkg的HelloWorld为目标调试工具
5.1添加调试代码
编辑HelloWorld源码目录在
~/UEFI/edk2/MdeModulePkg/Application/HelloWorld/HelloWorld.c
添加头文件声明
#include <Library/DebugLib.h>
主程序中添加获取程序入口地址代码
DEBUG ((EFI_D_INFO, "HelloWorld:My Entry point is 0x%08x\n", (CHAR16*)UefiMain ));
接着编辑OvmfPkg.dsc,文件路径在
~/UEFI/edk2/OvmfPkg/OvmfPkgX64.dsc
在[Components]下添加代码
MdeModulePkg/Application/HelloWorld/HelloWorld.inf{
<LibraryClasses>
DebugLib|MdePkg/Library/UefiDebugLibConOut/UefiDebugLibConOut.inf
}
5.2编译OVMF镜像
build -p edk2/OvmfPkg/OvmfPkgX64.dsc -t GCC5 -a X64 -b DEBUG
以done标志成功,编译完成的文件在~/edk2/Build/OvmfX64/DEBUG_GCC5中,镜像文件在此目录下的FV中,HelloWorld二进制文件在此目录下的X64中。
5.3准备qemu环境
~/UEFI mkdir ovmf_dbg
cd ovmf_dbg
cp edk2/Build/OvmfX64/DEBUG_GCC5/FV/OVMF.fd ./
cp mkdir hda_contents
cp edk2/Build/OvmfX64/DEBUG_GCC5/X64/HelloWorld.* ./had_contents
5.4启动qemu
qemu-system-x84_64 -s -pflash OVMF.fd -hda fat:rw:hda_contents/ -net none
-debugcon file:debug.log -global isa-debugcon.iobase=0x402
可能会提示

把他装了就完了,进入Shell,执行HelloWorld.efi,执行过程会同步将调试信息输出到debug.log

打开日志文件,查找加载驱动的指针地址Loading driver point

5.5 GDB挂载调试

计算偏移地址
text = 0x61D2000+0x0000240 = 0x61D2240
data = 0x61D2000+0x0000240+0x0002080 = 0x61D42c0
加载符号,设定断点,并将GDB挂载到QEMU上

回到Shell,再次运行HelloWorld.efi,断点被命中,gdb程序同步运行,可进行后续调试工作。

至此环境搭建确认完成,可以正常使用调试。