クロスコンパイラの作成 (ARM/Barematal)


毎回同じような時期にクロスコンパイラの作成をやっている気がします。
今回は対象を 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

ディレクトリ構成例

意外とここが大事なので注意してください。自分のやってみた範囲ではコードと中間成果物の位置関係が大事な部分があるようです。ここを対応していないような構成を取ってしまうと、途中でエラーが発生して進めなくなってしまいました。

スポンサーリンク

make作業

binutils, gcc, newlib らを先に説明したような場所に展開します。

基本的には別ディレクトリで作業するため build-* なディレクトリを作成します。

前提条件

先に説明したように、ベアメタルな環境を想定しているため、
この先の手順で作成したコンパイラを用いて linux で動く何かを作ることはできません。
また Raspberry Pi 2を対象として決めているので、 hard float ABI を使用し、arm-mode の命令を使ってほしいという想定で設定を行っています。

binutils 2.25.1

ここでは以下の設定で make, install を行いました.

disable-werror を付けないと、binutils の make に失敗してしまうので、付加してあります。以前はそのようなことがなかったため、ホスト gcc のバージョンが上がっていることによる挙動差かなと思っています。
さて、この binutils らをこの先使用するためにパスを通しておきます。

gcc 5.3.0 1回目

定番の話にはなるのですが、1回目のgcc では C言語のみの設定で gcc のみを生成させます。

newlib 2.1.0

ターゲットのシステムには OS がないため linux の共有オブジェクト群はありません。
システムコール類に当たる部分も自作する環境を考えているので
newlib のシステムコールを外した状態で出来上がるようにしています。
そのオプションが、”disable-newlib-supplied-syscalls” です。

make install の部分で失敗することがあれば、ディレクトリ構成を見直した方がよい感じでした。
試してみた範囲では構成を直しただけで成功するようになりました。

gcc 5.3.0 2回目

libcらが newlib によってできたため、残りの gcc の作業を行います。
先ほどのディレクトリに戻って、 make all で残っていた make作業を再開します。

まとめとこれから

これで C言語が使える gcc が出来上がりました。
C++も使えるようにするのであれば、C++ も有効にしてgccのmake 3回目を行えばよいようです。変更する部分は、 –enable-languages=c,c++ となります。

このようにしてできた gcc で -v で確認してみると以下のようになりました。

コツがわかればクロスコンパイラの作成は難しい点はなさそうです(たぶん

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする