目錄

edk2 Cross Build for AMD64

由於現在 ARM 的機器越來越容易取得,不管是 Raspberry Pi 4 或是各大雲端虛擬機,都出現了 ARM base 的機器,還是回來延續前一篇文章的缺憾吧。

限制

首先,根據 Ubuntu packages 上面的紀錄,預先編譯好的 amd64/x86 cross compiler 只有存在於 Ubuntu 20.04 或更新的版本,這限制了我們也只能用 Ubuntu 20.04 或更新的系統才能繼續,我可不想自己重新編譯這個。

安裝 cross complier

為了避免麻煩把常用的三種編譯器一次都安裝好

1
2
3
4
5
sudo apt update
sudo apt install -y \
  crossbuild-essential-i386 \
  crossbuild-essential-amd64 \
  crossbuild-essential-arm64

一點小修改

不知為何,在 Conf/tools_def.txt 裡面看起來 ia32/amd64 無法透過環境變數來修改 gcc 的檔名,但是 aarch64 卻可以。所以我們可以參考下面的改動來做一點小手腳來改善這個部分

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
diff --git a/BaseTools/Conf/tools_def.template b/BaseTools/Conf/tools_def.template
index 498696e583..51f9a5305f 100755
--- a/BaseTools/Conf/tools_def.template
+++ b/BaseTools/Conf/tools_def.template
@@ -2295,17 +2295,17 @@ RELEASE_GCC49_AARCH64_DLINK_XIPFLAGS = -z common-page-size=0x20
 ##################
 # GCC5 IA32 definitions
 ##################
-*_GCC5_IA32_OBJCOPY_PATH         = DEF(GCC5_IA32_PREFIX)objcopy
-*_GCC5_IA32_CC_PATH              = DEF(GCC5_IA32_PREFIX)gcc
-*_GCC5_IA32_SLINK_PATH           = DEF(GCC5_IA32_PREFIX)gcc-ar
-*_GCC5_IA32_DLINK_PATH           = DEF(GCC5_IA32_PREFIX)gcc
-*_GCC5_IA32_ASLDLINK_PATH        = DEF(GCC5_IA32_PREFIX)gcc
-*_GCC5_IA32_ASM_PATH             = DEF(GCC5_IA32_PREFIX)gcc
-*_GCC5_IA32_PP_PATH              = DEF(GCC5_IA32_PREFIX)gcc
-*_GCC5_IA32_VFRPP_PATH           = DEF(GCC5_IA32_PREFIX)gcc
-*_GCC5_IA32_ASLCC_PATH           = DEF(GCC5_IA32_PREFIX)gcc
-*_GCC5_IA32_ASLPP_PATH           = DEF(GCC5_IA32_PREFIX)gcc
-*_GCC5_IA32_RC_PATH              = DEF(GCC5_IA32_PREFIX)objcopy
+*_GCC5_IA32_OBJCOPY_PATH         = ENV(GCC5_IA32_PREFIX)objcopy
+*_GCC5_IA32_CC_PATH              = ENV(GCC5_IA32_PREFIX)gcc
+*_GCC5_IA32_SLINK_PATH           = ENV(GCC5_IA32_PREFIX)gcc-ar
+*_GCC5_IA32_DLINK_PATH           = ENV(GCC5_IA32_PREFIX)gcc
+*_GCC5_IA32_ASLDLINK_PATH        = ENV(GCC5_IA32_PREFIX)gcc
+*_GCC5_IA32_ASM_PATH             = ENV(GCC5_IA32_PREFIX)gcc
+*_GCC5_IA32_PP_PATH              = ENV(GCC5_IA32_PREFIX)gcc
+*_GCC5_IA32_VFRPP_PATH           = ENV(GCC5_IA32_PREFIX)gcc
+*_GCC5_IA32_ASLCC_PATH           = ENV(GCC5_IA32_PREFIX)gcc
+*_GCC5_IA32_ASLPP_PATH           = ENV(GCC5_IA32_PREFIX)gcc
+*_GCC5_IA32_RC_PATH              = ENV(GCC5_IA32_PREFIX)objcopy
 
 *_GCC5_IA32_ASLCC_FLAGS          = DEF(GCC5_ASLCC_FLAGS) -m32
 *_GCC5_IA32_ASLDLINK_FLAGS       = DEF(GCC5_IA32_X64_ASLDLINK_FLAGS) -Wl,-m,elf_i386 -no-pie
@@ -2327,17 +2327,17 @@ RELEASE_GCC5_IA32_DLINK_FLAGS    = DEF(GCC5_IA32_X64_DLINK_FLAGS) -flto -Os -Wl,
 ##################
 # GCC5 X64 definitions
 ##################
-*_GCC5_X64_OBJCOPY_PATH          = DEF(GCC5_X64_PREFIX)objcopy
-*_GCC5_X64_CC_PATH               = DEF(GCC5_X64_PREFIX)gcc
-*_GCC5_X64_SLINK_PATH            = DEF(GCC5_X64_PREFIX)gcc-ar
-*_GCC5_X64_DLINK_PATH            = DEF(GCC5_X64_PREFIX)gcc
-*_GCC5_X64_ASLDLINK_PATH         = DEF(GCC5_X64_PREFIX)gcc
-*_GCC5_X64_ASM_PATH              = DEF(GCC5_X64_PREFIX)gcc
-*_GCC5_X64_PP_PATH               = DEF(GCC5_X64_PREFIX)gcc
-*_GCC5_X64_VFRPP_PATH            = DEF(GCC5_X64_PREFIX)gcc
-*_GCC5_X64_ASLCC_PATH            = DEF(GCC5_X64_PREFIX)gcc
-*_GCC5_X64_ASLPP_PATH            = DEF(GCC5_X64_PREFIX)gcc
-*_GCC5_X64_RC_PATH               = DEF(GCC5_X64_PREFIX)objcopy
+*_GCC5_X64_OBJCOPY_PATH          = ENV(GCC5_X64_PREFIX)objcopy
+*_GCC5_X64_CC_PATH               = ENV(GCC5_X64_PREFIX)gcc
+*_GCC5_X64_SLINK_PATH            = ENV(GCC5_X64_PREFIX)gcc-ar
+*_GCC5_X64_DLINK_PATH            = ENV(GCC5_X64_PREFIX)gcc
+*_GCC5_X64_ASLDLINK_PATH         = ENV(GCC5_X64_PREFIX)gcc
+*_GCC5_X64_ASM_PATH              = ENV(GCC5_X64_PREFIX)gcc
+*_GCC5_X64_PP_PATH               = ENV(GCC5_X64_PREFIX)gcc
+*_GCC5_X64_VFRPP_PATH            = ENV(GCC5_X64_PREFIX)gcc
+*_GCC5_X64_ASLCC_PATH            = ENV(GCC5_X64_PREFIX)gcc
+*_GCC5_X64_ASLPP_PATH            = ENV(GCC5_X64_PREFIX)gcc
+*_GCC5_X64_RC_PATH               = ENV(GCC5_X64_PREFIX)objcopy
 
 *_GCC5_X64_ASLCC_FLAGS           = DEF(GCC5_ASLCC_FLAGS) -m64
 *_GCC5_X64_ASLDLINK_FLAGS        = DEF(GCC5_IA32_X64_ASLDLINK_FLAGS) -Wl,-m,elf_x86_64
警告
詳細修改如上,若 Conf/tools_def.txt 已經存在, 記得一併修改。

接著參考 Conf/tool_def.txt 的定義, 在開始 build code 前增加下列環境變數

1
2
3
export GCC5_IA32_PREFIX=i686-linux-gnu-
export GCC5_X64_PREFIX=x86_64-linux-gnu-
export GCC5_AARCH64_PREFIX=aarch64-linux-gnu-

這樣就大功告成啦,在 amd64 的系統環境就可以正常編譯 aarch64 的檔案,而在 arm64 的環境下也可以編譯 ia32/x64 的檔案了。