まずは,「ターゲットボード上で動作する "hello,world" プログラムを作成し,実行させる」というあたりを目標に掲げてみます.
プログラムは以下の通り.
#include <stdio.h>
int main ( void )
{
printf ( "hello,world\n" );
return 0;
}
さて,このプログラムをコンパイルしようとするのだけど,ターゲットボード上には gcc が載っていません. コンパイラをインストールしようにも,flash ROM ディスクの容量が全然足りません.
どうしましょ.
で,世の中には「クロスコンパイラ」というものがあります. クロスコンパイラとは,例えばx86 Linux マシンの上で MIPS Linux 用のプログラムをコンパイルするようなプログラムのことです. コンパイルを実行する環境と,コンパイルしたプログラムを実行する環境が別なので「クロス」というわけです. ちなみに,「コンパイル環境 = プログラム実行環境」の場合は「セルフコンパイル環境」と言います(余談).
ここで,GNU のコンパイラの基本的な構成要素を挙げると,
クロスコンパイラは,GNU がリリースしているソースから作成することもできますが,Linux MIPS や ARM Linux などのプロジェクトがリリースしているものを使用するのがオススメです. というのは,これらのリリースには,GNU のツリーに反映されていない修正などが入っている場合が多いので.
さて,クロスコンパイラのインストールが終わったところで,早速コンパイルしてみましょう.
mipsel-linux-gcc -static hello.c -o hello
「-static
」というオプションに注目.
ここでは「スタティックリンク」でコンパイルしています.
スタティックリンクというのは,printf() などのライブラリの関数のコードを実行ファイルに組み込むリンク方法です.
一方,x86 Linux で標準的なリンク方法は「シェアードライブラリを使う」方法です. シェアードライブラリ,というのは Windows で言うところの DLL のことです. このリンク方法では,printf() などのライブラリ関数のコードは実行ファイルには組み込まれません. 実行ファイルの実行時にライブラリファイルから読み込まれ,リンクが行われます.
ここで,これら 2 つのリンク方法の得失をまとめると
ちなみに「シェアードライブラリを搭載するかどうか」というのも組み込みシステム開発時の検討事項の 1 つだったりします. というのは,「ユーザランドのサイズを極小にする」という目的 1 つとっても
というわけで,コンパイルし生成した実行ファイルをターゲットボードに転送してみましょう. 無事 "hello,world" と表示されたでしょうか.