目錄

EDK2 編譯介紹

介紹如何 在 Ubuntu 18.04 環境下編譯 EDK2 UEFI BIOS

1 安裝必須的 build tools.

1
2
3
4
5
sudo apt update
sudo apt install -y \
  build-essential uuid-dev acpica-tools nasm \
  python3.8 python3-distutils python3-pip \
  gawk bc git
小記
如果需要 Java 可以額外增加 default-jre
提示

若需要在 ubuntu 20.04 以上環境執行,補上下面兩行讓 python3pip3 可以指到 pythonpip 會比較方便

1
2
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 10
sudo update-alternatives --install /usr/bin/pip pip /usr/bin/pip3 10

這樣 compiler 環境就結束了,超簡單。

2 下載 EDK2 source code

1
2
3
git clone https://github.com/tianocore/edk2.git ~/edk2
cd ~/edk2
git submodule init && git submodule update
小記
現在 EDK2 有越來越多的 sub module, 務必記得把 submodule 抓下來。
提示

文章寫作時間當下最新的 release/tags 為 edk2-stable202002, 建議先切到目前最新的 tag 上,避免最新的 master 可能 build 不過

1
2
cd ~/edk2
git checkout tags/edk2-stable202002 -b edk2-stable202002

3 基本設定

因為 EDK2 有用到 OpenSSL, 但需要額外的修改以配合 EDK2 的 環境, 所以需要先將檔案 patch 好。

1
2
3
cd ~/edk2
cd ~/edk2/CryptoPkg/Library/OpensslLib
perl process_files.pl
提示
若你要編譯的 code 用不到 OpenSSL, 這個步驟不做也可以。

4 EDK2 BuildTools 建置

因為 EDK2 有自己的 toolset, 需要在開始 build code 前先把所需的 build tool 建出來。

提示
這個步驟只要做一次。

依序輸入

1
2
3
cd ~/edk2
source edksetup.sh
make -C BaseTools/

若沒有看到 error,就可以開始真正開始 build code 了

5 編譯 EFI package

終於要進入正題了,先來編譯一個 OvmfPkg 試試吧。

1
2
3
cd ~/edk2
source edksetup.sh
build -a X64 -t GCC5 -p OvmfPkg/OvmfPkgX64.dsc -b DEBUG
提示
  • -a 代表 TARGET_ARCH,可能的值為 X64 或是 IA32 IA32 X64
  • -t 代表 TOOL_CHAIN_TAG,在 Linux 下通常為 GCC5
  • -p 代表 ACTIVE_PLATFORM,這是用來指定要 編 哪一個 Package,通常我們會輸入 *.dsc 檔案的相對路徑。

建置成功後,來跑個 qemu 模擬一下這個 UEFI BIOS

小記
如果跑在 VPS 上可能不能用喔,改用 WSL2 跑 QEMU
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
sudo apt install qemu-system-x86
HDA_CONTENTS=hda-contents
if [ ! -d "${HDA_CONTENTS}" ]; then
  mkdir ${HDA_CONTENTS}
fi
qemu-system-x86_64 \
  -nodefaults \
  -machine q35 \
  -smp 4 \
  -m 128 \
  -serial mon:stdio \
  -vga std \
  --net none \
  -drive if=pflash,format=raw,file=Build/OvmfX64/DEBUG_GCC5/FV/OVMF_CODE.fd,readonly=on \
  -drive if=pflash,format=raw,file=Build/OvmfX64/DEBUG_GCC5/FV/OVMF_VARS.fd \
  -drive format=raw,file=fat:rw:${HDA_CONTENTS}"
小記
  • HDA_CONTENTS 換成想要 mapping 進 UEFI BIOS 的目錄
  • Build/OvmfX64/DEBUG_GCC5/FV/ 換成自己的路徑
提示
若要在純 terminal 的環境下跑, 在 qemu 多補上 -display none 這個參數就可以了

6 參考

New Cross OS tool chain CLANG9