少ないリソースを酷使する

低レイヤーとレトロPC(PC98,MSX)が好きな情報学生

【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に感謝🙏