ARM 用クロスコンパイラのインストール(Ubuntu 上)

ARM 用のクロスコンパイラには、用途により次の種類がある。

このページでは、Ubuntu 24.04 LTS および Ubuntu 26.04 LTS を対象に、次の3通りの手順を説明する。


apt によるクロスコンパイラのインストール

  1. 端末(terminal)を開く
  2. 端末で、次のコマンドを実行する(パッケージリストの情報を更新する)
    sudo apt update
    
  3. 端末で、次のコマンドを実行する(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
    
  4. 端末で、次のコマンドを実行する(ベアメタル用(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
    
  5. 端末で、次のコマンドを実行する(インストールされたバージョンを表示して確認する)
    arm-linux-gnueabihf-gcc --version
    aarch64-linux-gnu-gcc --version
    arm-none-eabi-gcc --version
    

    apt で入る GCC のバージョンは Ubuntu のリリースに対応して決まる。Ubuntu 24.04 LTS では GCC 13 系、Ubuntu 26.04 LTS では GCC 15 系である。

動作確認

  1. 端末で、次のコマンドを実行する(確認用の C プログラムを作る)
    cd /tmp
    cat > hello.c <<'EOF'
    #include <stdio.h>
    
    int main(void)
    {
        printf("Hello, Arm World!\n");
        return 0;
    }
    EOF
    
  2. 端末で、次のコマンドを実行する(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-aarch64
    

    file コマンドの表示に「ARM」「ARM aarch64」と出れば、目的のアーキテクチャ向けにコンパイルされている。

  3. 端末で、次のコマンドを実行する(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 のダウンロードページ からも取得できる。

  1. 端末(terminal)を開く
  2. 端末で、次のコマンドを実行する(ダウンロードに使う curl と、展開に使う xz-utils をインストールする)
    sudo apt update
    sudo apt -y install curl xz-utils
    
  3. 端末で、次のコマンドを実行する(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-toolchain
    

    ARM の Ubuntu マシン上で使う場合は、ファイル名の x86_64aarch64 に置き換える。ARM Linux 上で動くプログラムを作る場合は、ファイル名の arm-none-eabiarm-none-linux-gnueabihf(32ビット)または aarch64-none-linux-gnu(64ビット)に置き換える。

  4. 端末で、次のコマンドを実行する(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
    
  5. 端末で、次のコマンドを実行する(インストールされたバージョンを表示して確認する)
    arm-none-eabi-gcc --version
    

ソースコードからのビルド(ターゲット:arm-none-eabi)

ベアメタル用のクロスコンパイラをソースコードからビルドする。ビルドは、binutilsGCC(第1段階:C コンパイラのみ)newlibGCC(第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 とする。バージョン番号は、上記の配布元ページで最新のものに読み替えてよい。

前準備

  1. 端末(terminal)を開く
  2. 端末で、次のコマンドを実行する(ビルドに必要なパッケージをインストールする)
    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
    
  3. 端末で、次のコマンドを実行する(インストール先ディレクトリを作り、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 のビルドとインストール

  1. 端末で、次のコマンドを実行する(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
    
  2. 端末で、次のコマンドを実行する(ソースコードのディレクトリとは別のディレクトリでビルドする)
    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 install
    

    GCC 側でソースコードのディレクトリ内でのビルドは支持されていないため、binutils も同様に別ディレクトリ(ここでは build-arm-none-eabi)でビルドしている。

  3. 端末で、次のコマンドを実行する(インストールされたバージョンを表示して確認する)
    /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)だけをビルドする。

  1. 端末で、次のコマンドを実行する(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
    
  2. 端末で、次のコマンドを実行する(第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
    
  3. 端末で、次のコマンドを実行する(インストールされたバージョンを表示して確認する)
    /opt/arm-none-eabi/bin/arm-none-eabi-gcc --version
    

newlib のビルドとインストール

newlib は、OS を使わない環境向けの C ライブラリである。第1段階でインストールした C コンパイラを用いてビルドする。

  1. 端末で、次のコマンドを実行する(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
    
  2. 端末で、次のコマンドを実行する(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)の実装をそのまま使う場合は、このオプションを外す。

  3. 端末で、次のコマンドを実行する(newlib のライブラリがインストールされたことを確認する)
    ls /opt/arm-none-eabi/arm-none-eabi/lib/libc.a
    

GCC(第2段階:C と C++)のビルドとインストール

newlib がインストールされたので、C++ コンパイラと libgcc、libstdc++ を含めてビルドする。

  1. 端末で、次のコマンドを実行する(第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
    
  2. 端末で、次のコマンドを実行する(インストールされたバージョンを表示して確認する)
    /opt/arm-none-eabi/bin/arm-none-eabi-gcc --version
    /opt/arm-none-eabi/bin/arm-none-eabi-g++ --version
    
  3. 端末で、次のコマンドを実行する(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組の objdumpreadelfnm などで、ARM、AArch64、x86 など多数のアーキテクチャのオブジェクトファイルを解析できるようになる。逆アセンブルによる解析を行う場合に有用である。

  1. 端末(terminal)を開く
  2. 端末で、次のコマンドを実行する(ビルドに必要なパッケージをインストールする)
    sudo apt update
    sudo apt -y install build-essential flex bison texinfo zlib1g-dev libzstd-dev curl xz-utils
    
  3. 端末で、次のコマンドを実行する(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
    
  4. 端末で、次のコマンドを実行する(--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 install
    

    Ubuntu 標準の binutils を置き換えるとシステムのビルド環境に影響するため、/opt の下にインストールしている。

  5. 端末で、次のコマンドを実行する(対応しているアーキテクチャの一覧を表示して確認する)
    /opt/binutils-all/bin/objdump --info | head -30
    

    なお、複数アーキテクチャに対応したデバッガが必要な場合は、Ubuntu のパッケージ gdb-multiarch をインストールする。端末で、次のコマンドを実行する。

    sudo apt -y install gdb-multiarch
    gdb-multiarch --version