【macOSも対応】ARMv8 64bit向けのGCCコンパイル環境を構築する
きっかけ
RaspberryPiのベアメタルプログラミングを始めたくなったのでARM向けのバイナリがはけるコンパイラを準備しようと思った。
想定環境
自分が普段使っているメイン機はMacなのでMacでコンパイルしたい。
Mac以外のOS(Windows/Linux)の人は以下の公式のビルド済みツールチェーン
から読み始めてください。
自分のMac:$ sw_vers ProductName: Mac OS X ProductVersion: 10.14.5 BuildVersion: 18F132
ターゲットはRaspberryPiのARMチップ、Raspi2以降のCortex-A
シリーズ向けのバイナリがはければいい。
ちなみに以下がRaspiのチップとそのアーキテクチャの対応表。
RaspberryPi CPU's
Raspberry Pi 1系 zero系 |
Raspberry Pi 2 Model B |
Raspberry Pi 3系 | Raspberry Pi 4系 | |
---|---|---|---|---|
CPU | ARM 1176JZF-S | (ARM Cortex-A7) ARM Cortex-A53 |
ARM Cortex-A53 | ARM Cortex-A72 |
アーキテクチャ | ARMv6 | (ARMv7) ARMv8 |
ARMv8 | ARMv8 |
せっかくならARMv8以降なら64bitモード(AArch64)で使いたいので64bit向けバイナリをはいて欲しい。
よって、
MacがホストでターゲットはARM(32bit/64bit)のクロスコンパイラを準備する。
公式のビルド済みツールチェーン(Windows/Linuxの人)
Mac以外のOSを使っている人は、以下のARM Developer公式からビルド済みのツールチェーンが公開されているのでそれをダウンロードして使うだけ。(未検証)
GNU Toolchain | GNU-A Downloads – Arm Developer
このサイトのGNU-A(Cortex-Aファミリ用GNUツールチェーン)は過去にLinaroが配布していたものと同じらしいので以下からもダウンロードできる。
Builds & Downloads - Linaro
【MacOS】32bit(AArch32)クロスコンパイラ
一応32bit向けクロスコンパイラの話も。
Homebrewでインストールする方法が以下に書かれている。
Homebrew様様。
www.yokoweb.net
使ってみる
$ arm-none-eabi-gcc -c startup.S -o startup.o $ file startup.o startup.o: ELF 32-bit LSB relocatable, ARM, EABI5 version 1 (SYSV), not stripped
【MacOS】64bit(AArch64)クロスコンパイラ
急いでるの人のために結論から書くとこれもHomebrewで入れられる。
入れ方
$ brew tap SergioBenitez/osxct $ brew install aarch64-none-elf
使ってみる
$ aarch64-none-elf-gcc -mcpu=cortex-a53 -c startup.S -o startup.o $ file startup.o startup.o: ELF 64-bit LSB relocatable, ARM aarch64, version 1 (SYSV), not stripped
しかしながら上記の結論にたどり着くまで文字通り3日3晩悩まされた。
調べ方が悪いのかMacOS向けのAArch64コンパイラ情報が見つからない・・・
ソースコードからビルドしなければいけないのは覚悟していたが、「ビルドしてみた」的な報告情報が全く見つからない。
自分でビルドしてみたところ爆時間かかる上に失敗する。ビルドエラーを取り除くためにGCCのソースコードを手作業で修正したりもした。
make -j2
でビルドしても普通に1日かかったので3日3晩はあっという間だった・・・
今度からはとりあえず[欲しいもの Homebrew]
で検索しようと思う。
Homebrewに感謝🙏