読み込み中...

クロスコンパイラ

フリー百科事典『ウィキペディア(Wikipedia)』より

クロスコンパイラ: Cross compiler)とは、コンパイラが動作している以外のプラットフォーム向けに実行ファイルを生成する機能を持つコンパイラである。クロスコンパイラは主に組み込みシステム向けのコンパイラとして使われたり、マルチプラットフォーム対応のコンパイルに使われる。実行ファイルを動作させたいプラットフォームがコンパイル環境としては不適切な場合には必須であり、例えばマイクロコントローラを使った組み込みシステムは本来の用途に必要最小限のメモリしか搭載していないことが多い。システムが複数のプラットフォームをサポートする場合に、準仮想化のためのツールとしてクロスコンパイラを利用することが一般化しつつある。

使用法

クロスコンパイラの基本的使用法は、ビルド環境をターゲット環境から分離することである。これは以下のような場合に便利である。
  • リソースが極めて限られている組み込みシステム。例えば電子レンジに組み込まれたコンピュータは非常に小型で、入力として操作パネルとドアの開閉センサ、出力としてディスプレイとスピーカーがあり、調理用機械を制御する。このコンピュータ上で、コンパイラやファイルシステムや開発環境を動作させるのには無理がある。デバッグテストには組み込みシステムが備えている以上のリソースが必要とされるため、クロスコンパイルは通常のコンパイルよりもエラーを多めに検出する傾向がある。
  • 複数マシン向けのコンパイル。例えば、企業が1つのOSの複数バージョンをサポートする場合や、複数のOSをサポートする場合。クロスコンパイラを使えば、1つのビルド環境でそれら複数のターゲットのコンパイルが可能となる。
  • サーバファームでのコンパイル。複数マシン向けのコンパイルと似ているが、サーバファーム上の比較的暇なマシン上で任意のサーバ向けのビルドを行う。
  • 新たなプラットフォーム向けのブートストラッピング。新しいプラットフォーム向けにソフトウェアを開発する場合や将来のプラットフォームのエミュレータについて、クロスコンパイラでOSやネイティブのコンパイラといった必要なツールをコンパイルする。

JavaJVMのような仮想機械を使うことで、クロスコンパイラを開発する動機となっている問題の一部は解決される。仮想機械は、1つのコンパイラの出力を複数の異なるシステムで利用可能にする。

典型的にはコンピュータ・アーキテクチャが異なればクロスコンパイラを利用することになる(例えば、MIPSアーキテクチャ向けのプログラムをx86上でコンパイルするなど)。しかしそれだけでなく、OS環境が違うだけであってもクロスコンパイラが使われ、例えばLinux上でFreeBSD用の実行ファイルを作るといった利用が考えられる。さらには、システムライブラリが違う環境向けのクロスコンパイルもある(glibcホスト上でuClibcを使ったコンパイルをするなど)。

GCCとクロスコンパイル

GCCは、コンパイラ群を集約したフリーソフトウェアであり、クロスコンパイル向けの設定も可能である。GCCは様々なプラットフォームや言語をサポートしている。しかし、手が足りないためにクロスコンパイラの保守がなされていない場合があり、多くのリリースでクロスコンパイラが機能していない。

GCC には、ターゲットプラットフォーム毎にbinutilsのコンパイルされたコピーが必要である。その中でも GNUアセンブラ が重要である。従って、binutils をまず --target=some-target スイッチ付きでコンパイルしなければならない。GCC も同じ --target オプション付きで設定しなければならない。GCC はパスで指定されたbinutilsを使って普通に動作する。パスは bash の場合以下のように指定される。

PATH=/path/to/binutils/bin:$PATH; make

クロスコンパイルを行うGCCでは、ターゲットプラットフォームの標準Cライブラリがホストプラットフォームで利用可能になっている必要がある。少なくとも、crt0 というライブラリの一部は必須である。標準Cライブラリ全体をコンパイルした場合、プラットフォームによっては大きすぎることもある。代替として、標準CライブラリのうちC言語のソースコードのコンパイルに必須な部分だけを抽出した newlib を使う方法もある。GCC で newlib を使うには --with-newlib スイッチを使う。

GNU autotools パッケージでは、ビルドプラットフォーム(build platform)、ホストプラットフォーム(host platform)、ターゲットプラットフォーム(target platform)という用語を使う。ビルドプラットフォームとは、コードが実際にコンパイルされる場所を指す。ホストプラットフォームとは、コンパイルされたコードが実行される場所を指す。ターゲットプラットフォームとは、コンパイラにのみ適用され、パッケージ自身が生成するオブジェクトコードのタイプを表す(例えば、クロスコンパイラをクロスコンパイルする場合など)。それ以外の場合はターゲットプラットフォームの設定は不適切である。例えば、ドリームキャストで動作するビデオゲームのクロスコンパイルを考えると、コンパイルを行うマシンがビルドプラットフォームで、ドリームキャストがホストプラットフォームとなる。

カナディアンクロス

カナディアンクロス(Canadian Cross)とは、他のマシンで動作するクロスコンパイラを作成する技法である。三種類のマシン A, B, C があるとき、B で動作して C 向けの実行ファイルを生成するクロスコンパイラを A 上で作ることをいう。GCC でカナディアンクロスを行う場合、4つのコンパイラが関わってくる。

# マシンAのネイティブのプロプライエタリなコンパイラ。これを使って次のコンパイラを構築する。 # マシンAのGCCネイティブコンパイラ。これを使って次のコンパイラを構築する。 # マシンA上でマシンBのコードを生成するGCCクロスコンパイラ。これを使って次のコンパイラを構築する。

# マシンB上でマシンCのコードを生成するGCCクロスコンパイラ。

最後のクロスコンパイラはビルドを行っているマシンA上では動作できないが、マシンB上でそれを使えば、マシンC上で動作する実行ファイルを生成できる。

例えば、NetBSDにはPOSIXシェルスクリプト build.sh があり、これを使ってホストコンパイラで自前のツールチェインを構築でき、さらにそこからクロスコンパイラを構築していくことができる。

「カナディアンクロス」という呼称は、当時のカナダに3つの大きな政党があったことに由来する

関連項目

脚注

外部リンク

  • Cross GNUクロスコンパイルツールについて
  • Building GCCクロスコンパイルについてのウィキ
  • Scratchbox ARMとx86をターゲットとしたLinux用クロスコンパイル・ツールキット
  • Crosstool Linux で各種クロスコンパイル環境を作るためのスクリプト群
  • buildroot 組み込みシステム向けのuClibcベースの環境構築のためのスクリプト群
  • T2 各種標準Cライブラリを使ったLinux上のクロスコンパイル環境を作るスクリプト群
  • Cross
 読み込み中...

ブログレシピコミュニティお小遣いふくびき壁紙写真

Copyright(C)2009 GMO Media, Inc. All Rights Reserved.