毎回同じような時期にクロスコンパイラの作成をやっている気がします。
今回は対象を Raspberry PI 2 で、ベアメタル用のクロスコンパイラの作成をテーマにやっています。
使用した環境やツールは以下のようになっています。
- Ubuntu 15.10 (AMD64)
- gcc version 5.2.1 20151010 (Ubuntu 5.2.1-22ubuntu2)
使用したソース類
- gcc 5.3.0
- binutils 2.25.1
- newlib-2.1.0
ディレクトリ構成例
意外とここが大事なので注意してください。自分のやってみた範囲ではコードと中間成果物の位置関係が大事な部分があるようです。ここを対応していないような構成を取ってしまうと、途中でエラーが発生して進めなくなってしまいました。
+ opt + src | + binutils-2.25.1 | + gcc-5.3.0 | + newlib-2.1.0 | + build-binutils | + build-gcc | + build-newlib + cross-pi2 (ここにコンパイラ&ライブラリ等が生成される)
make作業
binutils, gcc, newlib らを先に説明したような場所に展開します。
$ cd opt/src $ tar xjf binutils-2.25.1.tar.bz2 $ tar xzf newlib-2.1.0.tar.gz $ tar xjf gcc-5.3.0.tar.bz2
基本的には別ディレクトリで作業するため build-* なディレクトリを作成します。
$ mkdir build-{binutils,newlib,gcc}
前提条件
先に説明したように、ベアメタルな環境を想定しているため、
この先の手順で作成したコンパイラを用いて linux で動く何かを作ることはできません。
また Raspberry Pi 2を対象として決めているので、 hard float ABI を使用し、arm-mode の命令を使ってほしいという想定で設定を行っています。
binutils 2.25.1
ここでは以下の設定で make, install を行いました.
$ cd build-binutils $ ../binutils-2.25.1/configure \ --prefix=/home/appuser/opt/cross-pi2 --target=arm-unknown-eabi \ --with-no-thumb-interwork \ --with-mode=arm \ --disable-werror \ --disable-multilib $ make && make install
disable-werror を付けないと、binutils の make に失敗してしまうので、付加してあります。以前はそのようなことがなかったため、ホスト gcc のバージョンが上がっていることによる挙動差かなと思っています。
さて、この binutils らをこの先使用するためにパスを通しておきます。
$ export PATH=$PATH:/home/appuser/opt/cross-pi2/bin
gcc 5.3.0 1回目
定番の話にはなるのですが、1回目のgcc では C言語のみの設定で gcc のみを生成させます。
$ cd build-gcc $ ../gcc-5.3.0/configure \ --target=arm-unknown-eabi \ --prefix=/home/appuser/opt/cross-pi2 \ --with-mode=arm \ --with-arch=armv7-a \ --disable-multilib \ --with-no-thumb-interwork \ --enable-languages=c \ --with-newlib \ --with-headers=/home/appuser/opt/src/newlib-2.1.0/newlib/libc/include \ --disable-threads \ --disable-gomp \ --disable-libssp \ --disable-zlib \ --disable-shared \ --disable-libquadmath \ --disable-libatomic \ --with-float=hard \ --with-fpu=neon-vfpv4 $ make all-gcc $ make install-gcc
newlib 2.1.0
ターゲットのシステムには OS がないため linux の共有オブジェクト群はありません。
システムコール類に当たる部分も自作する環境を考えているので
newlib のシステムコールを外した状態で出来上がるようにしています。
そのオプションが、”disable-newlib-supplied-syscalls” です。
$ cd build-newlib $ ../newlib-2.1.0/configure \ --target=arm-unkown-eabi \ --prefix=/home/appuser/opt/cross-pi2 \ --disable-multilib \ --disable-newlib-supplied-syscalls \ --with-float=hard \ --with-mode=arm \ --disable-nls \ --with-cpu=armv7-a \ --with-fpu=newon-vfpv4 $ make && make install
make install の部分で失敗することがあれば、ディレクトリ構成を見直した方がよい感じでした。
試してみた範囲では構成を直しただけで成功するようになりました。
gcc 5.3.0 2回目
libcらが newlib によってできたため、残りの gcc の作業を行います。
先ほどのディレクトリに戻って、 make all で残っていた make作業を再開します。
$ cd build-gcc $ make all && make install
まとめとこれから
これで C言語が使える gcc が出来上がりました。
C++も使えるようにするのであれば、C++ も有効にしてgccのmake 3回目を行えばよいようです。変更する部分は、 –enable-languages=c,c++ となります。
このようにしてできた gcc で -v で確認してみると以下のようになりました。
ターゲット: arm-unknown-eabi configure 設定: ../gcc-5.3.0/configure --target=arm-unknown-eabi --prefix=/home/appuser/opt/cross-pi2 --with-mode=arm --with-arch=armv7-a --disable-multilib --with-no-thumb-interwork --enable-languages=c,c++ --with-newlib --with-headers=/home/appuser/opt/src/newlib-2.1.0/newlib/libc/include --disable-threads --disable-gomp --disable-libssp --disable-zlib --disable-shared --disable-libquadmath --disable-libatomic --with-float=hard --with-fpu=neon-vfpv4 スレッドモデル: single gcc バージョン 5.3.0 (GCC)
コツがわかればクロスコンパイラの作成は難しい点はなさそうです(たぶん