GAIO CLUB

2004年12月02日

GNUの組み込み開発ツールを利用するには 突然「GNU」で開発せよを言われたらまず何をしますか?

GAIO CLUB 特集
GAIO CLUB【2004/12月号】
組み込みソフト技術者知識講座
GNUの組み込み開発ツールを利用するには
~ 突然「GNUで開発せよ」と言われたらまず何をしますか? ~


今回の特集は、普段GNU、UNIXの環境を使っていないエンジニアのための「GNU入門講座」です。Windowsベースの開発環境で仕事をする貴方が、突然「GNUのコンパイラを使うように」と言われてしまったら、まず、何をすれば良いのかから始めましょう。

GNU(グニュー)と言えば、インターネットで公開されているオープンソースのプロジェクトであること位は、ご存知のことと思います。しかしながら、実際にWEBをアクセスしてみると、情報が非常に多く、UNIXベースであること等から、必要なものを的確に探すのは時間を要するかも知れません。

ちなみに、ガイオはクロスコンパイラのメーカです。競合である「フリー」のGNUのコンパイラを利用する方法をここで紹介するのは妙な話ではあります。しかしながら、クロスコンパイラは、皆様の製品に搭載されるROMコードを作成する基幹ツールです。簡単に置き換えが可能なわけではなく、この選定については、別の視点で考える必要があることを付け加えて置きます。この特集記事は、あくまで、GNUを利用した開発の方法の入門編としてご理解下さい。

GNUソフトウエアとは

「オープンソース」と言う言葉がありますが、これは文字通り「ソースコードが公開されている」と言うことです。この中には、「フリーソフトウエア」、「パブリックドメインソフトウエア」と言われるものがあります。「フリー」は何をしても良いと言うことであり、たとえWEB上にあるソフトウエアを改変してビジネスを行っても、何からも咎められることはありません。また、「パブリックドメイン」は、「著作権が放棄された」を意味する法律用語です。この2つは共に「自由に利用可能」を意味しているようですが、著作権に対する法律的な解釈が必要な用語の様です。

GNUのプロジェクトでは、著作権を意味する「Copyright」をもじった、「Copyleft」と言う言葉が作られており、著作権に関しての独特の主張をしています。これらについては、GNUのWEBサイト(http://www.gnu.org/)をご覧下さい。日本語の翻訳(’Translations of this page’ をクリック)も用意されています。

組み込みプラットフォームにも利用可能

GNUソフトウエアは、ほとんど全てのプラットフォームで動作します。この中に、組み込みプラットフォームも含まれています。開発パッケージには、クロスコンパイル環境、デバッグ環境も含まれています。GNUソフトウエアの大部分は、UNIX互換ソフトウエアとしてUNIXシステム上で使用されることを前提として、作成されています。
組み込み開発でも、GNUソフトウェアはクロスコンパイル環境として使われています。最近話題の組み込みLinuxのアプリケーション開発にも、GNUソフトウェアが使用されています。

クロスコンパイル環境でよく使用されるツールには、以下の様なものがあります。

・エディタ : vi、Emacsエディタ
・コンパイラ : C言語のgcc、C++用のg++
・ ライブラリ : libcとlibg++
・ アセンブラとリンカ : gasというアセンブラとldというリンカ
・ バイナリユーティリティ : size、nm、gprof
・デバッガ : gdb
・ ソフトウェア構築 : make
・ソースコード管理 : RCSパッケージ


現在では、以下のマイコンがサポートされている様です。

・ PowerPC m68k i960 SH H8/300
・ MIPS AMD29K
・ SPARC SPARClite ARM
・ v850 FRV Mep etc..

GNUクロスコンパイラ使うには

GNUはオープンソースプロジェクトであるため、クロスコンパイラ自体のソースコードも公開されています。クロスコンパイラを使用するには、そのソースコードを入手して、使用形態に合わせたコンフィギュレーションを行い、開発に使用するホストマシンのコンパイラで実行モジュールを作成すれば良いことになります。

GNUコンパイル環境は、以下のURLに掲載されています。

http://directory.fsf.org/devel/(※現在はアクセスできません)

本稿では、トライアルをして頂くためにも、何も購入することなく、全てをWEBから入手してGNUコンパイラを利用します。

クロスコンパイル環境としてCygwinを利用する

GNUはUNIXベースのソフトウエアであるため、UNIXで提供されるシェルなどの機能と親和性が高くなっています。Linuxマシンを新設する方法もありますが、本特集では、普段使用しているWindowsを利用して、環境を変えることなく利用できる「Cygwin」を利用したいと思います。

Cygwinは Red Hat Inc.社で行われているプロジェクトで、GNUのツールをWin-dows上で動かそうというものです。

ここで勘違いしやすいのは、CygwinはOSではありません。OSの実体はあくまでWindowsであり、WindowsにUNIXのAPIを使えるようにするためのライブラリ(cygwin1.dll)を追加する仕組みです。UNIXのコマンドやシェルが使用できる「DOS窓」と思った方が良いでしょう。このCygwin環境を使用すれば、WindowsでGNUソフトウェアを利用した組み込み開発ができるわけです。

Cygwinをサイトから入手してインストールする

では早速、Cygwinを入手してPCへインストールしてみましょう。このCygwinは、Windows上で動作するUNIXエミュレータのような環境で、ファイルシステムやウインドウは、Windowsのものをそのまま使用します。Cygwin自体のインストール/アンインストールは、Windowsシステムに影響を与えることなく自由に行うことができますし、Cygwin専用にHDDのパーテションを用意したりする必要も全くありません。

インストールは、WEBページ(http://cygwin.com/)のセットアッププログラムを使用します。このプログラムには、パッケージのあるFTPサイトからインストールに必要なモジュールをダウンロードする機能が備わっています。

インストール中、ダウンロードサイトを選択する場面(Choose A Download Site)があるのですが、全てのミラーサイトに同じ物があるわけではなく、サイトによって揃っているパッケージがまちまちです。初めての方は、この当たりが分かりにくいかも知れません。筆者は、「ftp://ring.so-net.ne.jp」を試しましたが、ここには、一通り必要なパッケージが揃っている様でした。

クロスコンパイラの利用に必要なパッケージ

今回はクロスコンパイラの利用に必要な必要最低限のパッケージをインストールします。もちろん、時間とHDDに余裕がある場合は、全てインストールしても構いません。必要最低限のインストールカテゴリは、以下の通りです。
  • Base(基本プロダクト)→ Default
    Devel(開発環境)→ Install
    Libs(ライブラリ)→ Default
    Shells(コマンドシェル)→ Default
    Text(テキストツール)→ Default
  • セットアッププログラムでインストールパッケージを選択(DefaultをクリックするとInstallに変わる)

Cygwin環境を立ち上げてみる

インストールが終了したら、デスクトップ上のCygwinショートカットを起動して見て下さい。DOSプロンプトの様なコマンドウインドウが立ち上がります。これが、CygwinのUNIX互換の仮想コンソールです。

通常UNIXというと、ユーザー名を指定してログインしてから使用しますが、Cygwinにはこれも必要有りません。インストール直後から直ぐに使える状態になります。この環境の標準のシェル(コマンドインタプリタ)は「bash」と呼ばれるUNIXで代表的なシェルです。もちろんc shellの様な別のシェルを利用することもできます。
  • CygwinのファイルはWindowsのファイルと共通です。Cygwin上でファイルを作成すると、Windowsのファイルとして作成されます。テキストファイルは、Windowsのエディタで作成して問題ありませんが、改行コードが、Windows(LF+CR)とUNIX(LFのみ)の間で異なっているため、エディタの機能でUNIXに合わせることが必要です。
  • 起動直後のCygwinの仮想コンソール

Cygwinのファイルシステム

UNIXでは、通常、ログインするユーザー毎に、HOMEディレクトリを作成しますが、Cygwinインストール直後は、Win-dowsでのユーザー用のディレクトリ(「c:¥Documents and Settings」フォルダの「ユーザー名」フォルダ)が、Cygwin上でのホームディレクトリとなっています。これは、Cygwinコンソールに、「$ pwd」コマンドを入力することで確認できます。

Cygwinには、Windowsのパスを直接参照するための仮想ディレクトリ「/cygdrive/c/」があり、これを先頭に付けると、Win-dows上のファイルを直接参照できます。また、Cygwinの中でのルートディレクトリは、Windows上の「c:¥cygwin」フォルダに対応しています。

シェルの環境作成については、UNIXのbashシェルの仕様と同様に、ホームディレクトリ上の「.bashrc」ファイルに記述して使用します。bashについての詳細は、WEB情報や参考書なども多くありますので、別途参照下さい。

Cygwinを使って組み込み開発環境を構築する

では次に、このCygwin環境にクロス開発環境をインストールしてみましょう。今回は、ARMをターゲットとして、ARM用のオブジェクトコードを生成するための環境セットアップを行って見ます。

まず、下の3つの必要なモジュールを、GNUのサイトからダウンロードします。ダウンロードはIEなどのWindows環境のWEBブラウザを使用して問題ありません。ダウンロードしたファイルをCygwinでの「/usr/src」ディレクトリ、すなわちWindows上の「c:¥cygwin¥usr¥src」へドラッグしてコピー(移動)して使用します。

バイナリツール(アセンブラ、リンカ、etc…)
http://ftp.gnu.org/gnu/binutils/binutils-2.15.tar.gz


Cコンパイラ
ftp://ftp.iij.ad.jp/pub/gcc/releases/gcc-3.4.1/gcc-core-3.4.1.tar.gz


組み込み用ライブラリ
ftp://sources.redhat.com/pub/newlib/newlib-1.12.0.tar.gz


次にダウンロードした各モジュールを解凍、展開します。この作業はCygwinのターミナルから、コマンドベースで行います。ここからはUNIXの世界です。
下にバイナリツール(binutil-2.15)の手順を示します。残りの2つのモジュールも同じ手順で行います。

【手順】binutils-2.15の場合

1./usr/srcへダウンロードファイルをコピーする
2.gzipコマンドで解凍をする$ gzip -d binutils-2.15.tar.gz
3.tarコマンドで展開をする$ tar xvf binutils-2.15.tar


以下のディレクトリに各コンポーネントが展開されます。

/usr/src/binutils-2.15
/usr/src/gcc-core-3.4.1
/usr/src/newlib-1.12.0


次に、ビルドを行い実行モジュールを作成します。

【手順】binutils-2.15の場合

1.コンフィグレーションコマンドにより、ビルドを行うためのMakefile等を作成する

$cd/usr/src/binutils-2.15
$./configure–target=arm-gaio-elf


※–targetオプションの表記(ARCHITECTURE-VENDOR-OS)この表記は何が記述できるかは、configureファイルを見て確認する必要があります。”VENDOR”には何を定義しても影響はないので、ここの例では”gaio”を指定しています。”OS”には、VxWorks、Linux、winceを指定しますが、組み込みではOMF(オブジェクトフォーマット)の種類を定義することになっています。

2.makeコマンドを実行して、クロスコンパイラなどの実行モジュールをビルドする

$make
$make install


全てコンポーネントのmakeが完了すると、「/usr/local/bin」ディレクトリに armのコンパイル環境が作成されます。また、クロスコンパイルに必要なヘッダファイル、ライブラリは各々「/usr/local/arm-gaio-elf/include」「/usr/local/arm-gaio-elf/lib」フォルダに作成されます。
環境構築後の/usr/local/binディレクトリ
環境構築後の/usr/local/arm-gaio-elf/includeディレクトリ各種C言語用ヘッダファイル
環境構築後の/usr/local/arm-gaio-elf/libディレクトリ

コンパイルの準備を行う

では、作成したコンパイラでARM用の組み込みソースをコンパイルしてみます。

Cygwinのデフォルトのパスは、/bin/usr/bin に設定されていますが、作成したarmのコンパイル環境を起動することはできません。まず、環境設定として、bashコマンドを使用してパスの設定を行います。

$export PATH=/usr/local/bin:${PATH}

次にmakeファイルを作成します。必ず必要なファイルではありませんが、一般の開発では多くのソースファイルを扱うため、makeファイルを作成したほうが良いでしょう。GNUには、「GNU make」というツールがありますので、このプロダクトをダウンロードしておきます。Cygwinのsetupプログラムでは、「Devel」のカテゴリに含まれていますが、Defaultでは選択されないようですので、チェックをしてダウンロードを行ってください。setupプログラムは、後からモジュールを追加する場合でも利用できます。
  • 本稿では、makeファイルを使用せずに、話を進めます。
  • setupプログラムでmakeユーティリティを追加

オブジェクトコードを作成してみる

コンパイラ・アセンブラを起動して、オブジェクトを作成するには、以下のコマンドを使用します。

$arm-gaio-elf-gcc hello.c(C言語ソースのとき)
$arm-gaio-elf-gcc asm_source.s(アセンブリ言語ソースのとき)


拡張子が.cのときは、C言語とみなします。拡張子が.sのときは、アセンブリ言語とみなします。コンパイル後のオブジェクトファイルは、拡張子が.oの名前で作成されます。

本来、アセンブラはarm-gaio-elf-as、リンカはarm-gaio-elf-ldですが、使い分ける必要は無く、arm-gaio-elf-gccコマンドを起動するだけで自動的にファイルが判別され、アセンブラ、リンカが呼び出されます。

参考に、GNUでサポートされているARMプロセッサのアーキテクチャを次に挙げておきます。
GNUでサポートされているARMプロセッサのアーキテクチャ

標準のアドレスマップでリンクを行う

標準のアドレスマップでリンクを行うのであれば、下記のように gcc-gaio-elf-gccコマンドでリンクまで行うことができます。

$arm-gaio-elf-gcc hello.c asm_source.s -otest

リンク後のオブジェクト名は、-o オプションを使ってファイル名を指定します。これだけの記述だけで、hello.c asm_source.sファイルの他、スタートアッププログラム”crt0.o”、printf などのライブラリが自動的にリンクされます。下に、標準のリンクマップ例を挙げておきます。
標準のリンクマップ例

リンカスクリプトについて

組み込み機器ではハードウェアの構成によって、アプリケーションのメモリ上のレイアウトを細かく設定する必要があります。この定義をするのがリンカスクリプトです。

・リンカスクリプトの与え方の例
$arm-gaio-elf-gcc hello.c asm_source.s -otest -Wl,-T script.ld


-Wl, の指定は、リンカへの起動オプションを定義しています。 -Wl, 以降に記述したオプションがリンカに渡ります。上記の例では、”-T script.ld” がリンカに渡ります。script.ld が、リンカスクリプトファイルです。
リンクスプリクトの記述例

人気のコラム

最新のコラム