クロス
コンパイラとは、
コンパイラが動作している環境とは異なるプラットフォーム(ターゲット環境)向けの
実行ファイルを生成する
コンパイラのことです。通常、
コンパイラは自身が動作する環境と同じプラットフォーム向けの
実行ファイルを生成しますが、クロス
コンパイラは異なる環境向けに特化しています。
組み込みシステム開発: リソースが限られたマイクロコントローラ上で動作するプログラムを開発する際に、開発環境とは別の環境でコンパイルを行う必要があります。例えば、電子レンジの制御プログラムをPC上でコンパイルし、それを電子レンジの組み込みコンピュータに転送して実行します。
マルチプラットフォーム対応: 複数のOSやアーキテクチャをサポートするアプリケーションを開発する際、それぞれの環境向けに個別にコンパイルする手間を省くことができます。クロス
コンパイラを利用することで、単一の開発環境から複数のプラットフォーム向けの
実行ファイルを生成できます。
サーバファームでのコンパイル: 大規模なサーバファームで、複数のサーバ向けにコンパイルする場合に、特定のサーバに負荷が集中するのを避けるために、別のサーバでコンパイルを行います。
新しいプラットフォームのブートストラップ: 新しいプラットフォーム向けのOSや
コンパイラを開発する際に、そのプラットフォーム上で直接コンパイルするのではなく、既存のプラットフォームでクロスコンパイルを行うことで、開発を効率化します。
実行ファイルを動作させたいプラットフォームが、コンパイル環境として不適切な場合にクロス
コンパイラは必須となります。例えば、以下のようなケースが挙げられます。
リソースが限られた組み込みシステム: 電子レンジなどの組み込みシステムでは、コンパイラやファイルシステムなどの開発環境を動作させるための十分なリソースがありません。そのため、別の環境でコンパイルを行う必要があります。
セキュリティ上の制限: モバイルOSなどの環境では、アプリケーションのインストールや実行に制限があるため、直接コンパイルを行うことが難しい場合があります。クロス
コンパイラを使用することで、開発環境とは異なるプラットフォーム向けの
実行ファイルを生成できます。
クロスコンパイラの具体的な使用法
クロス
コンパイラの基本的な使用法は、ビルド環境(コンパイルを行う環境)をターゲット環境(
実行ファイルが動作する環境)から分離することです。これにより、以下のようなメリットが得られます。
リソースの効率的な利用: リソースが限られた環境でコンパイルを行う必要がなくなります。
開発効率の向上: 複数のプラットフォーム向けの
実行ファイルを単一の開発環境で生成できます。
デバッグの容易化: デバッグやテストに必要なリソースを確保しやすくなります。
アーキテクチャとOSの違い
クロスコンパイラは、異なるアーキテクチャ(例:x86とARM)間のコンパイルだけでなく、異なるOS環境(例:LinuxとFreeBSD)や、異なるシステムライブラリ(例:glibcとuClibc)間のコンパイルにも利用されます。
GCCとクロスコンパイル
GCC(GNU Compiler Collection)は、クロスコンパイルをサポートする代表的なコンパイラです。様々なプラットフォームや言語に対応していますが、クロスコンパイルの保守が行き届いていない場合もあります。GCCでクロスコンパイルを行うには、ターゲットプラットフォーム用のbinutils(特にGNUアセンブラ)が必要です。
GCCでのクロスコンパイルの手順
1. binutilsのコンパイル: `--target=some-target` オプションを指定してbinutilsをコンパイルします。
2. GCCのコンパイル: 同じく `--target` オプションを指定してGCCをコンパイルします。この際、binutilsのパスを指定します。
3. 標準Cライブラリの準備: ターゲットプラットフォームの標準Cライブラリ(crt0など)をホストプラットフォームで利用できるようにする必要があります。newlibを利用することで、軽量な標準Cライブラリを使用できます。
GNU autotoolsにおけるプラットフォームの概念
GNU autotoolsでは、ビルドプラットフォーム(コードがコンパイルされる場所)、ホストプラットフォーム(コンパイルされたコードが実行される場所)、ターゲットプラットフォーム(クロスコンパイラが生成するオブジェクトコードのタイプ)という3つの概念を区別します。
カナディアンクロス
カナディアンクロスは、別のマシンで動作するクロスコンパイラを作成する手法です。3つのマシンA、B、Cがあるとき、Bで動作してC向けの実行ファイルを生成するクロスコンパイラをA上で作成することを指します。
カナディアンクロスの手順
1. マシンAのネイティブコンパイラ: マシンA上で次のコンパイラを構築するために使用されます。
2. マシンAのGCCネイティブコンパイラ (A-A-A): マシンA上で次のコンパイラを構築するために使用されます。
3. マシンA上でマシンBのコードを生成するGCCクロスコンパイラ (A-A-B): マシンA上で次のコンパイラを構築するために使用されます。
4. マシンB上でマシンCのコードを生成するGCCクロスコンパイラ (A-B-C): これが最終的なクロスコンパイラであり、マシンB上で使用してマシンC向けの実行ファイルを生成します。
カナディアンクロスの必要性
GCCでは、configure実行時に指定したターゲットプラットフォーム向けのビルドしかできない制約があるため、カナディアンクロスが必要になります。LLVMでは、バックエンドを実行時に指定できるため、カナディアンクロスは必須ではありません。
まとめ
クロスコンパイラは、異なるプラットフォーム向けの実行ファイルを生成するための重要なツールです。組み込みシステムやマルチプラットフォーム開発において不可欠であり、リソース制約や環境の違いを克服するための有効な手段となります。GCCやLLVMなどのツールを理解し、適切に活用することで、より効率的な開発が可能になります。
関連項目
コンパイラ
外部リンク
Cross Compilation Tools
Building Cross Toolchains with gcc
Scratchbox
Crosstool
buildroot
T2 SDE
*
Cross Linux from Scratch Project