「 Building a cross toolchain for Raspberry Pi 3 Model B」
https://www.nayab.xyz/rpi3b-elinux/embedded-linux-rpi3-010-toolchain.html
に沿って作業してみる。
環境
- 母艦 Ubuntu Linux 20.04 LTS AMD64 日本語版 ( also Windows WSL2 )
- ターゲット Raspberry Pi 3 ( also Raspberry Pi 4 )
事前のインストール
作業していたら出てきたエラー
-
コマンド 'git' が見つかりません。
-
./bootstrap: 行 821: autoreconf: コマンドが見つかりません
-
configure: error: missing required tool: flex
-
configure: error: missing required tool: makeinfo
-
configure: error: missing required tool: help2man
-
configure: error: Required tool not found: GNU awk
-
checking for GNU libtool >= 2.4... no configure: error: Required tool not found: libtool
-
configure: error: curses library not found
-
/bin/bash: yacc: コマンドが見つかりません
のために、以下のようにインストールしています。
$ sudo apt install build-essential git autoconf flex texinfo help2man gawk libtool-bin libncurses-dev bison make autoconf automake libtool
ここで、 libtool-bin についてメモ。
$ sudo apt install libtool
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
libtool はすでに最新バージョン (2.4.6-14) です。
アップグレード: 0 個、新規インストール: 0 個、削除: 0 個、保留: 292 個。
としても、
checking for GNU libtool >= 2.4... no
configure: error: Required tool not found: libtool
となりました。
これは libtool-bin ではなく libtool だけだとこうなるようです。
作業場所作成
今回は、RaspberryPi3をターゲットにするために rpi3 というフォルダにします。RaspberryPi4などをターゲットにする場合は rpi4 などにするのがいいでしょう。
$ mkdir ~/rpi3
$ cd ~/rpi3
ダウンロード
$ git clone https://github.com/crosstool-ng/crosstool-ng.git
$ cd crosstool-ng/
checkout
記事詩筆時には 75d7525a として checkout しました(気がしますが、記録が不完全で自信がありませんトホホ)
$ git checkout 75d7525a
なお、ブート環境の開発などを行う場合は以下を選択しました。(上記の75d7525a だと、RaspberryPi4 に対応できていないようだとのことです。)
$ git checkout crosstool-ng-1.25.0 -b 1.25.0
crosstool-ng をインストール
crosstool-ng はツールチェインを生成する専用コマンドです。
$ ./bootstrap
$ ./configure --enable-local
$ make -j`nproc`
ビルドツールを設定
ターゲットが RaspberryPi3 を使うので、以下のようにしました。
$ ./ct-ng aarch64-rpi3-linux-gnu
ターゲットが RaspberyPi4 の場合は以下を選んでみます。
$ ./ct-ng aarch64-rpi4-linux-gnu
その後
$ ./ct-ng menuconfig
とします。
画面が以下のように出るので
.config - crosstool-NG 1.24.0.299_6729a76 Configuration
──────────────────────────────────────────────────────────────────────────────
┌───────────── crosstool-NG 1.24.0.299_6729a76 Configuration ─────────────┐
│ Arrow keys navigate the menu. <Enter> selects submenus ---> (or empty │
│ submenus ----). Highlighted letters are hotkeys. Pressing <Y> │
│ includes, <N> excludes, <M> modularizes features. Press <Esc><Esc> to │
│ exit, <?> for Help, </> for Search. Legend: [*] built-in [ ] │
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ Paths and misc options ---> │ │
│ │ Target options ---> │ │
│ │ Toolchain options ---> │ │
│ │ Operating System ---> │ │
│ │ Binary utilities ---> │ │
│ │ C-library ---> │ │
│ │ C compiler ---> │ │
│ │ Debug facilities ---> │ │
│ │ Companion libraries ---> │ │
│ │ Companion tools ---> │ │
│ └─────────────────────────────────────────────────────────────────────┘ │
├─────────────────────────────────────────────────────────────────────────┤
│ <Select> < Exit > < Help > < Save > < Load > │
└─────────────────────────────────────────────────────────────────────────┘
- Path and misc options で Maximum log level to see: (EXTRA) を DEBUG に
- Operating System で Version of linux を確認、実験環境では 5.10.7 でした。
- Debug facilities では gdb にチェックが付いているのを消して、全てなしにしました。
なお、RaspberryPiのKernelをビルドする際に Operating Syatem で 5.10.7 だと問題があり、以下のように結構古いバージョンにしました。
┌────────────────────── Version of linux ───────────────────────┐
│ Use the arrow keys to navigate this window or press the │
│ hotkey of the item you wish to select followed by the <SPACE │
│ BAR>. Press <?> for additional information about this │
│ ┌───────────────────────────^(-)────────────────────────────┐ │
│ │ ( ) 5.1.21 │ │
│ │ ( ) 5.0.19 │ │
│ │ (X) 4.20.17 │ │
│ │ ( ) 4.19.229 │ │
│ │ ( ) 4.18.20 │ │
│ │ ( ) 4.17.19 │ │
│ └───────────────────────────v(+)────────────────────────────┘ │
├───────────────────────────────────────────────────────────────┤
│ <Select> < Help > │
└───────────────────────────────────────────────────────────────┘
なお、2022/10/15 に行った低レベル勉強会では RaspberryPi4をターゲットにした場合は以下のようなサジェスチョンを頂いています。
- Target options -> Emit assembly for CPUで coretx-a53をcoretex72に変更
- Toolchain options -> Tuple's vendor stringで rpi3をrpi4に変更のようです。
- もうひとつ、Paths and misc options -> Render the tool chain read-onlyをfalseに。
参考URL https://ilyas-hamadouche.medium.com/creating-a-cross-platform-toolchain-for-raspberry-pi-4-5c626d908b9d
設定が終わったら、 Save して、 .config を選び、Exit
ツールチェインをビルド
$ ./ct-ng build
とするとビルドが始まります。
2022/10/29追記
[DEBUG] ==> Return status 8
[DEBUG] Not at this location: "https://www.zlib.net//zlib-1.2.12.tar.gz"
[ERROR] zlib: download failed
[ERROR]
というエラーが出ました。
あらかじめ /rpi3/crosstool-ng/.build/tarballsに、 $ として、ダウンロードしておきます。
無限の時が流れて
.
.
.
[ALL ] '/home/nanbuwks/rpi3/crosstool-ng/licenses.d/by-sa/legalcode_files/deeds.css' -> '/home/nanbuwks/x-tools/aarch64-rpi3-linux-gnu/share/licenses/crosstool-ng/licenses.d/by-sa/legalcode_files/deeds.css'
[ALL ] '/home/nanbuwks/rpi3/crosstool-ng/licenses.d/by-sa/legalcode_files/logo_code.gif' -> '/home/nanbuwks/x-tools/aarch64-rpi3-linux-gnu/share/licenses/crosstool-ng/licenses.d/by-sa/legalcode_files/logo_code.gif'
[DEBUG] ==> Return status 0
[INFO ] Finalizing the toolchain's directory: done in 9.37s (at 383:32)
[INFO ] Build completed at 20210411.070001
[INFO ] (elapsed: 383:31.51)
[INFO ] Finishing installation (may take a few seconds)..
ビルドが終わりました。
~/x-tools/ に生成されています。
$ ls ~/x-tools/
aarch64-rpi3-linux-gnu
パスを通しておきましょう
$ echo 'export PATH=$PATH:$HOME/x-tools/aarch64-rpi3-linux-gnu/bin/' >> ~/.bashrc
$ source ~/.bashrc
テスト
$ cd ~/rpi3
$ vim dummy.c
として、以下の C ソースファイルを作ります。
int main(void)
{
return 0;
}
以下のようにしてクロスビルドします。
$ aarch64-rpi3-linux-gnu-gcc dummy.c -o dummy
バイナリができたようですようです。
$ ls
crosstool-ng dummy dummy.c
ファイルを検査すると ARM aarch64 となっていて、うまくいっているようです。
$ file dummy
dummy: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, for GNU/Linux 5.10.7, with debug_info, not stripped
できました。