読み込み中...クロスコンパイラ(英: Cross compiler)とは、コンパイラが動作している以外のプラットフォーム向けに実行ファイルを生成する機能を持つコンパイラである。クロスコンパイラは主に組み込みシステム向けのコンパイラとして使われたり、マルチプラットフォーム対応のコンパイルに使われる。実行ファイルを動作させたいプラットフォームがコンパイル環境としては不適切な場合には必須であり、例えばマイクロコントローラを使った組み込みシステムは本来の用途に必要最小限のメモリしか搭載していないことが多い。システムが複数のプラットフォームをサポートする場合に、準仮想化のためのツールとしてクロスコンパイラを利用することが一般化しつつある。
JavaのJVMのような仮想機械を使うことで、クロスコンパイラを開発する動機となっている問題の一部は解決される。仮想機械は、1つのコンパイラの出力を複数の異なるシステムで利用可能にする。
典型的にはコンピュータ・アーキテクチャが異なればクロスコンパイラを利用することになる(例えば、MIPSアーキテクチャ向けのプログラムをx86上でコンパイルするなど)。しかしそれだけでなく、OS環境が違うだけであってもクロスコンパイラが使われ、例えばLinux上でFreeBSD用の実行ファイルを作るといった利用が考えられる。さらには、システムライブラリが違う環境向けのクロスコンパイルもある(glibcホスト上でuClibcを使ったコンパイルをするなど)。
GCCは、コンパイラ群を集約したフリーソフトウェアであり、クロスコンパイル向けの設定も可能である。GCCは様々なプラットフォームや言語をサポートしている。しかし、手が足りないためにクロスコンパイラの保守がなされていない場合があり、多くのリリースでクロスコンパイラが機能していない。
GCC には、ターゲットプラットフォーム毎にbinutilsのコンパイルされたコピーが必要である。その中でも GNUアセンブラ が重要である。従って、binutils をまず --target=some-target スイッチ付きでコンパイルしなければならない。GCC も同じ --target オプション付きで設定しなければならない。GCC はパスで指定されたbinutilsを使って普通に動作する。パスは bash の場合以下のように指定される。
クロスコンパイルを行う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つの大きな政党があったことに由来する。
読み込み中...