次のページ 前のページ 目次へ

3. "hello,world"

まずは,「ターゲットボード上で動作する "hello,world" プログラムを作成し,実行させる」というあたりを目標に掲げてみます.

プログラムは以下の通り.

#include <stdio.h>

int main ( void )
{
        printf ( "hello,world\n" );
        return 0;
}

3.1 クロスコンパイル環境

さて,このプログラムをコンパイルしようとするのだけど,ターゲットボード上には gcc が載っていません. コンパイラをインストールしようにも,flash ROM ディスクの容量が全然足りません.

どうしましょ.

で,世の中には「クロスコンパイラ」というものがあります. クロスコンパイラとは,例えばx86 Linux マシンの上で MIPS Linux 用のプログラムをコンパイルするようなプログラムのことです. コンパイルを実行する環境と,コンパイルしたプログラムを実行する環境が別なので「クロス」というわけです. ちなみに,「コンパイル環境 = プログラム実行環境」の場合は「セルフコンパイル環境」と言います(余談).

ここで,GNU のコンパイラの基本的な構成要素を挙げると,

  1. binutils
    アセンブラ・リンカ・バイナリ操作プログラムなど
  2. gcc
    コンパイラ
  3. libc
    C の標準的なライブラリ
のようになります. binutils と gcc をまとめて「ツールチェイン(toolchain)」と呼ぶこともあります.

クロスコンパイラは,GNU がリリースしているソースから作成することもできますが,Linux MIPS や ARM Linux などのプロジェクトがリリースしているものを使用するのがオススメです. というのは,これらのリリースには,GNU のツリーに反映されていない修正などが入っている場合が多いので.

3.2 スタティックリンクとシェアードライブラリ

さて,クロスコンパイラのインストールが終わったところで,早速コンパイルしてみましょう.

mipsel-linux-gcc -static hello.c -o hello

-static」というオプションに注目. ここでは「スタティックリンク」でコンパイルしています.

スタティックリンクというのは,printf() などのライブラリの関数のコードを実行ファイルに組み込むリンク方法です.

一方,x86 Linux で標準的なリンク方法は「シェアードライブラリを使う」方法です. シェアードライブラリ,というのは Windows で言うところの DLL のことです. このリンク方法では,printf() などのライブラリ関数のコードは実行ファイルには組み込まれません. 実行ファイルの実行時にライブラリファイルから読み込まれ,リンクが行われます.

ここで,これら 2 つのリンク方法の得失をまとめると

つまり,ここでは「スタティックリンクの場合,大抵の環境で実行可能である」というあたりが重要なのです.

ちなみに「シェアードライブラリを搭載するかどうか」というのも組み込みシステム開発時の検討事項の 1 つだったりします. というのは,「ユーザランドのサイズを極小にする」という目的 1 つとっても

という事情があるので,一概にどっちがいい,とは言い切れません. まぁ,上記の事情から「(スクリプトではない)実行ファイルが多い場合には,シェアードライブラリが有利」ということは言えます.

3.3 実行

というわけで,コンパイルし生成した実行ファイルをターゲットボードに転送してみましょう. 無事 "hello,world" と表示されたでしょうか.


次のページ 前のページ 目次へ