いまさらIntel Galileo用のファームウェアをビルドする

何故かいまさらIntel Galileo (Gen1) を手に入れた。2枚。

それで、1枚のファームウェアが壊れてしまった?のだが、リカバリ用のバイナリは配布していなくて、自分で作れということらしい。
まあ、そのままもう1枚で遊べばよいのだけれど、せっかくなのでビルドしようかと。
そして、どハマりする。

Quark まわりのソースの更新はとっくに終わっている(※)が、ドキュメントに従うと環境 (edk2) が最新になってしまって、うまくいかない。
そこで、ソースの最終更新時点やその前後の edk2 を使ってみるが、それぞれ違う場所でエラーになる。
というか、どの時点のを使ってもエラーになる気がする。
依存関係が入り組んでいてよくわからん……

ドキュメントもWeb上に新旧いろいろ置いてあってどれが正しいかわかりにくい。
というか、どれも微妙に間違っている気がする。
よくわからん……

よくわからんので、「環境もソースも古いものを使う」方針でやったところ、一応ビルドは通ったのでメモっておく。

edk2 は vUDK2018 タグのものを使う。
この時期だと QuarkPlatformPkg がまだ edk2-platform に追い出されていない。(2019/05/13に移動)

手元の環境はWindowsだけれども、いまさら推奨のVS2015を入れるのもどうかと思ったので、WSL2でUbuntu 18.04.6 LTSを使用。
Ubuntu 20でも良いようなことが書いてあるドキュメントもあるが、標準の apt install では推奨の gcc 5.x が出てこなかった。

$ sudo apt update
$ sudo apt install build-essential uuid-dev iasl git nasm python
$ sudo apt install gcc-5-i686-linux-gnu
$ mkdir ~/src
$ cd ~/src
$ git clone -b vUDK2018 --recursive https://github.com/tianocore/edk2.git
$ git clone https://github.com/tianocore/edk2-non-osi.git
$ cd edk2
$ . edksetup.sh
$ make -C BaseTools

ポイント(?)は:

  • Ubuntu 18 入れたての場合、最初に apt update をキメないといろいろエラーが出る
  • ドキュメントには Python 3 で良さそうな記述もあるが、括弧なし print が紛れ込んでいるので Python 2.7 を使う
  • x64 の gcc-5 で(-m32 オプションが付くので)良いはずだが、なぜか GenFw でエラーが出るので IA32 用の gcc-5 を使う(理由は調べてない)
  • edk2 の clone 時に --recursive をつけると openssl (submodule) もとってきてくれる

次に、Conf/tools_def.txt を編集する。IA32用の gcc-5 を使わせる。

--- Conf/tools_def.txt.ORIG     2024-09-19 13:23:39.318273321 +0900
+++ Conf/tools_def.txt  2024-09-19 13:26:17.402136023 +0900
@@ -5460,17 +5460,17 @@
 ##################
 # 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         = DEF(GCC5_IA32_PREFIX)i686-linux-gnu-objcopy
+*_GCC5_IA32_CC_PATH              = DEF(GCC5_IA32_PREFIX)i686-linux-gnu-gcc-5
+*_GCC5_IA32_SLINK_PATH           = DEF(GCC5_IA32_PREFIX)i686-linux-gnu-gcc-ar-5
+*_GCC5_IA32_DLINK_PATH           = DEF(GCC5_IA32_PREFIX)i686-linux-gnu-gcc-5
+*_GCC5_IA32_ASLDLINK_PATH        = DEF(GCC5_IA32_PREFIX)i686-linux-gnu-gcc-5
+*_GCC5_IA32_ASM_PATH             = DEF(GCC5_IA32_PREFIX)i686-linux-gnu-gcc-5
+*_GCC5_IA32_PP_PATH              = DEF(GCC5_IA32_PREFIX)i686-linux-gnu-gcc-5
+*_GCC5_IA32_VFRPP_PATH           = DEF(GCC5_IA32_PREFIX)i686-linux-gnu-gcc-5
+*_GCC5_IA32_ASLCC_PATH           = DEF(GCC5_IA32_PREFIX)i686-linux-gnu-gcc-5
+*_GCC5_IA32_ASLPP_PATH           = DEF(GCC5_IA32_PREFIX)i686-linux-gnu-gcc-5
+*_GCC5_IA32_RC_PATH              = DEF(GCC5_IA32_PREFIX)i686-linux-gnu-objcopy

 *_GCC5_IA32_ASLCC_FLAGS          = DEF(GCC_ASLCC_FLAGS) -m32 -fno-lto
 *_GCC5_IA32_ASLDLINK_FLAGS       = DEF(GCC5_IA32_X64_ASLDLINK_FLAGS) -Wl,-m,elf_i386

あとは、テストがてら:

$ build -p MdeModulePkg/MdeModulePkg.dsc -t GCC5
$ file Build/MdeModule/DEBUG_GCC5/IA32/HelloWorld.efi
Build/MdeModule/DEBUG_GCC5/IA32/HelloWorld.efi: MS-DOS executable

と、HelloWorld.efi ができていればヨシ。
ここまでできれば、あとはこんな感じで Galileo 用のファームウェアも作れるはず。たぶん。

$ export WORKSPACE="$PWD"
$ export PACKAGES_PATH="$WORKSPACE:$WORKSPACE/../edk2-non-osi/Silicon/Intel"
$ export EDK_TOOLS_PATH="$WORKSPACE/BaseTools"
$ build -t GCC5 -p QuarkPlatformPkg/Quark.dsc -DGALILEO=GEN1 -DRECOVERY_ENABLE=TRUE


(でも別のところでつまっていて、リカバリ自体はまだ……)

最新版のソースのビルドを(楽に)通す方法が見つかればまたそのうち。

Intelの方はdiscontinueだが、edk2-platformの方はたまに手が入ってる。けれどビルドが通らなかった。みんなどんな環境でやってるのだろうか。