ARM 用クロスコンパイラのインストール(Ubuntu 上)
ARM 用のクロスコンパイラには、用途により次の種類がある。
- arm-linux-gnueabihf:32ビット ARM の Linux 上で動くプログラムを作る(ハードウェア浮動小数点演算、glibc を使用)
- aarch64-linux-gnu:64ビット ARM(AArch64)の Linux 上で動くプログラムを作る(glibc を使用)
- arm-none-eabi:OS を使わないベアメタル環境(Cortex-M、Cortex-R など)のプログラムを作る(newlib を使用)
このページでは、Ubuntu 24.04 LTS および Ubuntu 26.04 LTS を対象に、次の3通りの手順を説明する。
- Ubuntu のパッケージ(apt)でインストールする(最も簡単。通常はこの方法を使う)
- Arm 社が配布するビルド済みバイナリ(Arm GNU Toolchain)をインストールする(新しいバージョンの GCC を使いたい場合)
- ソースコードからビルドしてインストールする(構成を自分で指定したい場合)
apt によるクロスコンパイラのインストール
- 端末(terminal)を開く
- 端末で、次のコマンドを実行する(パッケージリストの情報を更新する)
sudo apt update - 端末で、次のコマンドを実行する(32ビット ARM Linux 用と 64ビット ARM Linux 用のクロスコンパイラをインストールする)
sudo apt -y install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf sudo apt -y install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu - 端末で、次のコマンドを実行する(ベアメタル用(arm-none-eabi)のクロスコンパイラ、binutils、newlib をインストールする)
sudo apt -y install gcc-arm-none-eabi binutils-arm-none-eabi sudo apt -y install libnewlib-arm-none-eabi libstdc++-arm-none-eabi-newlib - 端末で、次のコマンドを実行する(インストールされたバージョンを表示して確認する)
arm-linux-gnueabihf-gcc --version aarch64-linux-gnu-gcc --version arm-none-eabi-gcc --versionapt で入る GCC のバージョンは Ubuntu のリリースに対応して決まる。Ubuntu 24.04 LTS では GCC 13 系、Ubuntu 26.04 LTS では GCC 15 系である。
動作確認
- 端末で、次のコマンドを実行する(確認用の C プログラムを作る)
cd /tmp cat > hello.c <<'EOF' #include <stdio.h> int main(void) { printf("Hello, Arm World!\n"); return 0; } EOF - 端末で、次のコマンドを実行する(32ビット ARM Linux 用と 64ビット ARM Linux 用にクロスコンパイルする)
cd /tmp arm-linux-gnueabihf-gcc hello.c -o hello-arm aarch64-linux-gnu-gcc hello.c -o hello-aarch64 file hello-arm file hello-aarch64fileコマンドの表示に「ARM」「ARM aarch64」と出れば、目的のアーキテクチャ向けにコンパイルされている。 - 端末で、次のコマンドを実行する(QEMU をインストールし、x86_64 の Ubuntu 上で ARM 用実行ファイルを実行して確認する)
sudo apt -y install qemu-user-static qemu-arm-static -L /usr/arm-linux-gnueabihf /tmp/hello-arm qemu-aarch64-static -L /usr/aarch64-linux-gnu /tmp/hello-aarch64
Arm GNU Toolchain(ビルド済みバイナリ)のインストール
Arm GNU Toolchain は、Arm 社がビルドして配布しているクロスツールチェーンである。Ubuntu のパッケージより新しいバージョンの GCC を使いたい場合に用いる。年2回リリースされ、2026年8月時点の最新版は 15.3.rel1(GCC 15.3 ベース)である。
【関連する外部ページ】
配布元(Arm GitLab): https://gitlab.arm.com/tooling/gnu-toolchains-for-arm
15.3.rel1 以降のリリースは Arm GitLab のみで配布されている。14.3.rel1 以前のリリースは Arm Developer のダウンロードページ からも取得できる。
- 端末(terminal)を開く
- 端末で、次のコマンドを実行する(ダウンロードに使う curl と、展開に使う xz-utils をインストールする)
sudo apt update sudo apt -y install curl xz-utils - 端末で、次のコマンドを実行する(x86_64 Linux ホスト用・arm-none-eabi ターゲットのツールチェーンをダウンロードし、/opt の下に展開する)
cd /tmp curl -L -O "https://gitlab.arm.com/api/v4/projects/tooling%2Fgnu-toolchains-for-arm/packages/generic/gnu-toolchain/15.3.rel1/arm-gnu-toolchain-15.3.rel1-x86_64-arm-none-eabi.tar.xz" sudo mkdir -p /opt/arm-gnu-toolchain sudo tar -xJf arm-gnu-toolchain-15.3.rel1-x86_64-arm-none-eabi.tar.xz -C /opt/arm-gnu-toolchainARM の Ubuntu マシン上で使う場合は、ファイル名の
x86_64をaarch64に置き換える。ARM Linux 上で動くプログラムを作る場合は、ファイル名のarm-none-eabiをarm-none-linux-gnueabihf(32ビット)またはaarch64-none-linux-gnu(64ビット)に置き換える。 - 端末で、次のコマンドを実行する(PATH の設定を
~/.bashrcに追加し、現在の端末に反映する)echo 'export PATH="/opt/arm-gnu-toolchain/arm-gnu-toolchain-15.3.rel1-x86_64-arm-none-eabi/bin:$PATH"' >> ~/.bashrc source ~/.bashrc - 端末で、次のコマンドを実行する(インストールされたバージョンを表示して確認する)
arm-none-eabi-gcc --version
ソースコードからのビルド(ターゲット:arm-none-eabi)
ベアメタル用のクロスコンパイラをソースコードからビルドする。ビルドは、binutils → GCC(第1段階:C コンパイラのみ) → newlib → GCC(第2段階:C と C++、ランタイムライブラリ) の順に行う。GCC のビルドには C ライブラリのヘッダが必要であり、newlib のビルドには C コンパイラが必要であるため、GCC を2段階に分けてビルドする。
【関連する外部ページ】
GCC のビルド手順: https://gcc.gnu.org/install/
binutils の配布元: https://ftp.gnu.org/gnu/binutils/
GCC の配布元: https://ftp.gnu.org/gnu/gcc/
newlib の配布元: https://sourceware.org/pub/newlib/
以下では、2026年8月時点の版である binutils 2.47、GCC 16.2.0、newlib 4.6.0.20260123 を使用し、インストール先を /opt/arm-none-eabi とする。バージョン番号は、上記の配布元ページで最新のものに読み替えてよい。
前準備
- 端末(terminal)を開く
- 端末で、次のコマンドを実行する(ビルドに必要なパッケージをインストールする)
sudo apt update sudo apt -y install build-essential sudo apt -y install libgmp-dev libmpfr-dev libmpc-dev libisl-dev zlib1g-dev libzstd-dev sudo apt -y install flex bison texinfo gawk curl xz-utils - 端末で、次のコマンドを実行する(インストール先ディレクトリを作り、PATH の設定を
~/.bashrcに追加し、現在の端末に反映する)sudo mkdir -p /opt/arm-none-eabi sudo chown -R $USER /opt/arm-none-eabi echo 'export PATH="/opt/arm-none-eabi/bin:$PATH"' >> ~/.bashrc source ~/.bashrc/opt の下にインストールすることにより、Ubuntu のパッケージでインストールしたコンパイラと混在しない。なお、Ubuntu では
/usr/local/libは/etc/ld.so.conf.d/libc.confにより共有ライブラリの検索対象になっているため、/etc/ld.so.confへの追記は不要である。
binutils のビルドとインストール
- 端末で、次のコマンドを実行する(binutils のソースコードをダウンロードし、展開する)
cd /tmp if [ ! -f binutils-2.47.tar.xz ]; then curl -L -O https://ftp.gnu.org/gnu/binutils/binutils-2.47.tar.xz fi rm -rf binutils-2.47 tar -xJf binutils-2.47.tar.xz - 端末で、次のコマンドを実行する(ソースコードのディレクトリとは別のディレクトリでビルドする)
cd /tmp/binutils-2.47 rm -rf build-arm-none-eabi mkdir build-arm-none-eabi cd build-arm-none-eabi ../configure --target=arm-none-eabi \ --prefix=/opt/arm-none-eabi \ --with-sysroot=/opt/arm-none-eabi/arm-none-eabi \ --enable-multilib --disable-nls --disable-werror make -j$(nproc) make installGCC 側でソースコードのディレクトリ内でのビルドは支持されていないため、binutils も同様に別ディレクトリ(ここでは
build-arm-none-eabi)でビルドしている。 - 端末で、次のコマンドを実行する(インストールされたバージョンを表示して確認する)
/opt/arm-none-eabi/bin/arm-none-eabi-as --version /opt/arm-none-eabi/bin/arm-none-eabi-ld --version
GCC(第1段階:C コンパイラのみ)のビルドとインストール
この段階では C ライブラリがまだ存在しないため、--without-headers と --with-newlib を指定し、コンパイラ本体(all-gcc)だけをビルドする。
- 端末で、次のコマンドを実行する(GCC のソースコードをダウンロードして展開し、GCC が必要とする GMP、MPFR、MPC、ISL のソースコードを取得する)
cd /tmp if [ ! -f gcc-16.2.0.tar.xz ]; then curl -L -O https://ftp.gnu.org/gnu/gcc/gcc-16.2.0/gcc-16.2.0.tar.xz fi rm -rf gcc-16.2.0 tar -xJf gcc-16.2.0.tar.xz cd /tmp/gcc-16.2.0 ./contrib/download_prerequisites - 端末で、次のコマンドを実行する(第1段階の GCC をビルドしてインストールする)
cd /tmp/gcc-16.2.0 rm -rf build-stage1 mkdir build-stage1 cd build-stage1 ../configure --target=arm-none-eabi \ --prefix=/opt/arm-none-eabi \ --enable-languages=c \ --without-headers --with-newlib \ --with-gnu-as --with-gnu-ld --enable-multilib \ --disable-shared --disable-threads --disable-nls \ --disable-libssp --disable-libgomp --disable-libquadmath --disable-libatomic make -j$(nproc) all-gcc make install-gcc - 端末で、次のコマンドを実行する(インストールされたバージョンを表示して確認する)
/opt/arm-none-eabi/bin/arm-none-eabi-gcc --version
newlib のビルドとインストール
newlib は、OS を使わない環境向けの C ライブラリである。第1段階でインストールした C コンパイラを用いてビルドする。
- 端末で、次のコマンドを実行する(newlib のソースコードをダウンロードし、展開する)
cd /tmp if [ ! -f newlib-4.6.0.20260123.tar.gz ]; then curl -L -O https://sourceware.org/pub/newlib/newlib-4.6.0.20260123.tar.gz fi rm -rf newlib-4.6.0.20260123 tar -xzf newlib-4.6.0.20260123.tar.gz - 端末で、次のコマンドを実行する(newlib をビルドしてインストールする)
export PATH="/opt/arm-none-eabi/bin:$PATH" cd /tmp/newlib-4.6.0.20260123 rm -rf build-arm-none-eabi mkdir build-arm-none-eabi cd build-arm-none-eabi ../configure --target=arm-none-eabi \ --prefix=/opt/arm-none-eabi \ --enable-multilib --disable-nls \ --disable-newlib-supplied-syscalls make -j$(nproc) make install--disable-newlib-supplied-syscalls を指定すると、システムコールの実装(
_write、_sbrkなど)を自分のプログラム側で用意する構成になる。libgloss が提供する半ホスティング(semihosting)の実装をそのまま使う場合は、このオプションを外す。 - 端末で、次のコマンドを実行する(newlib のライブラリがインストールされたことを確認する)
ls /opt/arm-none-eabi/arm-none-eabi/lib/libc.a
GCC(第2段階:C と C++)のビルドとインストール
newlib がインストールされたので、C++ コンパイラと libgcc、libstdc++ を含めてビルドする。
- 端末で、次のコマンドを実行する(第2段階の GCC をビルドしてインストールする)
export PATH="/opt/arm-none-eabi/bin:$PATH" cd /tmp/gcc-16.2.0 rm -rf build-stage2 mkdir build-stage2 cd build-stage2 ../configure --target=arm-none-eabi \ --prefix=/opt/arm-none-eabi \ --enable-languages=c,c++ \ --with-newlib \ --with-sysroot=/opt/arm-none-eabi/arm-none-eabi \ --with-gnu-as --with-gnu-ld --enable-multilib \ --disable-shared --disable-threads --disable-nls \ --disable-libssp --disable-libgomp --disable-libquadmath --disable-libatomic \ --disable-libstdcxx-pch make -j$(nproc) make install - 端末で、次のコマンドを実行する(インストールされたバージョンを表示して確認する)
/opt/arm-none-eabi/bin/arm-none-eabi-gcc --version /opt/arm-none-eabi/bin/arm-none-eabi-g++ --version - 端末で、次のコマンドを実行する(Cortex-M4 向けにコンパイルできることを確認する)
export PATH="/opt/arm-none-eabi/bin:$PATH" cd /tmp cat > blink.c <<'EOF' int main(void) { volatile int i = 0; while (1) { i++; } } EOF arm-none-eabi-gcc -c -mcpu=cortex-m4 -mthumb blink.c -o blink.o arm-none-eabi-objdump -d blink.o | head -20リンクを行う場合は、対象マイコンのメモリ配置を記述したリンカスクリプトとスタートアップコードが別途必要である。半ホスティングを使って動作確認する場合は、
--specs=rdimon.specsを付けてリンクし、QEMU などのシミュレータで実行する。
複数のアーキテクチャに対応する binutils のビルドとインストール
--enable-targets=all を指定して binutils をビルドすると、1組の objdump、readelf、nm などで、ARM、AArch64、x86 など多数のアーキテクチャのオブジェクトファイルを解析できるようになる。逆アセンブルによる解析を行う場合に有用である。
- 端末(terminal)を開く
- 端末で、次のコマンドを実行する(ビルドに必要なパッケージをインストールする)
sudo apt update sudo apt -y install build-essential flex bison texinfo zlib1g-dev libzstd-dev curl xz-utils - 端末で、次のコマンドを実行する(binutils のソースコードをダウンロードし、展開する)
cd /tmp if [ ! -f binutils-2.47.tar.xz ]; then curl -L -O https://ftp.gnu.org/gnu/binutils/binutils-2.47.tar.xz fi rm -rf binutils-2.47 tar -xJf binutils-2.47.tar.xz - 端末で、次のコマンドを実行する(--enable-targets=all を指定してビルドし、/opt/binutils-all にインストールする)
cd /tmp/binutils-2.47 rm -rf build-all mkdir build-all cd build-all ../configure --enable-targets=all --enable-64-bit-bfd \ --prefix=/opt/binutils-all \ --disable-nls --disable-werror make -j$(nproc) sudo make installUbuntu 標準の binutils を置き換えるとシステムのビルド環境に影響するため、/opt の下にインストールしている。
- 端末で、次のコマンドを実行する(対応しているアーキテクチャの一覧を表示して確認する)
/opt/binutils-all/bin/objdump --info | head -30なお、複数アーキテクチャに対応したデバッガが必要な場合は、Ubuntu のパッケージ gdb-multiarch をインストールする。端末で、次のコマンドを実行する。
sudo apt -y install gdb-multiarch gdb-multiarch --version