ARMクロス開発環境構築

ARMクロス開発環境を、emdebianを使用して構築する方法を紹介します。

emdebian(The Embedded Debian Project)は、Debianのマルチアーキテクチャサポートのためのプロジェクトです。emdebianではクロス開発用ツールチェイン、クロス開発用ライブラリ、ユーザランド構築ツールなどARMシステムを構築するための環境一式が提供されます。クロス開発ツールチェインは、コンパイラ(gcc, g++)、プリプロセッサ(cpp)、リンカ(ld)、アセンブラ(ar)など開発に必要なもの全てを含んでいます。また、クロス開発用ライブラリは、libc及びlibstdc++を始めとして、Debianパッケージが用意されている何百ものライブラリが使用できます。もちろん、Debianと同じくフリーでオープンなので、無料で自由に使用できソースコードを取得することもできます。

ARM用のクロスツールチェインとしては、他にCodeSourceryの ものなどがあります。また、ARMの評価ボードや組み込みボードのメーカから、専用の開発環境が提供されていることも多いようです。emdebianを使 用することで特定のボード、メーカに依存することは無くなりますし、また、クロス開発用ライブラリがdebパッケージとして用意されているのでapt- crossで依存関係を含めて簡単にインストールできたり、OABIとEABIそれぞれのツールチェインが用意されていたりするなど、利便性でも一日の長 があるので、本サイトではクロス開発環境としてemdebianを使用します。

emdebianはその名前のとおりDebinプロジェクトから派生したものですので、ホスト環境としてはDebian(2009年5月時点ではLenny)を使用するのが一番相性が良いでしょう。Ubuntuでも大丈夫です。本サイトでは、Ubuntu 9.04をメインに使っています。一方で、FedraやRedhatなどのrpmを使ったディストリビューションとは相性が悪いと思います。そのような非Debian系のディストリビューションやWindowsで開発を行いたい場合は、VMWare等で仮想のDebian環境を用意してその上で開発環境を構築するというのも一つの手です。

ツールチェインのインストール

Debian 5.0 (Lenny)の場合

Debian 5.0 (Lenny)の場合は、emdebian-toolsを使用することで、簡単にクロス開発環境をインストールすることができます。

まずは、以下のコマンドで、emdebian-toolsをインストールします。

emdebian-toolsのインストール

$ sudo apt-get install emdebian-tools



emdebian-toolsのインストール中に、クロスビルドする際のデフォルトアーキテクチャを何にするか聞かれます。ここでは、"arm"を選択しました。EABI用のツールチェインをインストールする場合は、"armel"を選択すると良いでしょう。

そして、以下のコマンドでツールチェインをインストールします。

emsetupを使用したツールチェインのインストール

$ sudo apt-get update
$ LANG=C sudo emsetup --arch arm


Ubuntu 9.04 (Jaunty)の場合

2009年05月07日現在、Ubuntu 9.04の公式リポジトリにはemdebian-toolsがないため、手動でインストールします。

まずは、emdebianのリポジトリをaptのsouce listに登録します。

emdebianリポジトリの追加

$ echo "deb http://www.emdebian.org/debian/ lenny main" > /etc/apt/sources.list.d/emdebian.sources.list
$ wget -O- http://www.emdebian.org/0x97BB3B58.txt | sudo apt-key add -



そして、以下のコマンドでツールチェインをインストールします。

ARM OABI用ツールチェインのインストール

$ sudo apt-get update
$ sudo apt-get install gcc-4.3-arm-linux-gnu g++-4.3-arm-linux-gnu


EABI用のツールチェインをインストールする場合は、以下のようになります。

ARM EABI用ツールチェインのインストール

$ sudo apt-get install gcc-4.3-arm-linux-gnueabi g++-4.3-arm-linux-gnueabi



emdebianでは、OABIとEABIのツールチェインは共存できるので、両方インストールしても問題ありません。

ついでに、binutils-mutiarchもインストールしておきます。

binutils-multiarchのインストール

$ sudo apt-get install binutils-multiarch


コンパイル

OABI用のバイナリを生成するときはarm-linux-gnu-gccを、EABI用のバイナリを生成するときはarm-linux-gnueabi-gccを使用します。

それぞれのABI用にコンパイルしたときの、ELFヘッダは以下のようになります。

クロス開発用ツールチェインを使用したコンパイル

$ arm-linux-gnu-gcc -Wall sample.c -o oabi
$ readelf -h oabi
ELF Header:
  Magic:   7f 45 4c 46 01 01 01 61 00 00 00 00 00 00 00 00
  Class:                             ELF32
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            ARM
  ABI Version:                       0
  Type:                              EXEC (Executable file)
  Machine:                           ARM
  Version:                           0x1
  Entry point address:               0x83ac
  Start of program headers:          52 (bytes into file)
  Start of section headers:          3548 (bytes into file)
  Flags:                             0x2, has entry point, GNU EABI
  Size of this header:               52 (bytes)
  Size of program headers:           32 (bytes)
  Number of program headers:         7
  Size of section headers:           40 (bytes)
  Number of section headers:         35
  Section header string table index: 32

$ arm-linux-gnueabi-gcc -Wall sample.c -o eabi
$ readelf -h eabi
ELF Header:
  Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
  Class:                             ELF32
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              EXEC (Executable file)
  Machine:                           ARM
  Version:                           0x1
  Entry point address:               0x8354
  Start of program headers:          52 (bytes into file)
  Start of section headers:          3448 (bytes into file)
  Flags:                             0x4000002, has entry point, Version4 EABI
  Size of this header:               52 (bytes)
  Size of program headers:           32 (bytes)
  Number of program headers:         8
  Size of section headers:           40 (bytes)
  Number of section headers:         36
  Section header string table index: 33



Flagsの部分でOABIかEABIか見分けることができます。OABIでコンパイルしたほうももなぜか"GNU EABI"となっていますが、"Version4 EABI"となっているものが、DebianなどでEABIと呼ばれているものになります。

クロス開発用ライブラリのインストール

dpkg-crossを使用する方法

開発ターゲットのアーキテクチャ用のDebianパッケージをdpkg-crossというツールでクロス開発用に変換してからインストールします。

まずは、dpkg-crossをインストールします。

dpkg-crossのインストール

$ sudo apt-get update
$ sudo apt-get install dpkg-cross


次に、Debian パッケージのページで目的のパッケージを検索します。検索の際、ディストリビューションはemdebianのものと合わせてください。
Debian パッケージページ

例えば、JPEG画像を扱うためのライブラリである、libjpegを検索すると以下のページにたどり着きます。
http://packages.debian.org/lenny/libjpeg62

ここで、ARM OABI用のライブラリをダウンロードするにはarmアーキテクチャを、ARM EABI用にはarmelアーキテクチャを選択してください。

いくつかミラーサイトのURLが表示されますので、適当なミラーからDebianパッケージをダウンロードしてきます。

Debianパッケージのダウンロード

$ wget http://ftp.jp.debian.org/debian/pool/main/libj/libjpeg6b/libjpeg62_6b-14_armel.deb


dpkg-crossで、クロス開発用に変換します。

パッケージの変換

$ dpkg-cross --build --arch armel libjpeg62_6b-14_armel.deb
Building libjpeg62-armel-cross_6b-14_all.deb


dpkgコマンドに--contentsオプションをつけることで、パッケージに含まれるファイルを見ることができます。変換前後を比較してみると、変換前のパッケージでは/usr/libに配置されていたライブラリファイルが、変換後には/usr/arm-linux-gnueabi/lib/に配置されています。

ファイルの配置

$ dpkg --contents libjpeg62_6b-14_armel.deb
drwxr-xr-x root/root         0 2007-09-06 19:14 ./
drwxr-xr-x root/root         0 2007-09-06 19:12 ./usr/
drwxr-xr-x root/root         0 2007-09-06 19:13 ./usr/lib/
-rw-r--r-- root/root    133464 2007-09-06 19:13 ./usr/lib/libjpeg.so.62.0.0
drwxr-xr-x root/root         0 2007-09-06 19:12 ./usr/share/
drwxr-xr-x root/root         0 2007-09-06 19:12 ./usr/share/doc/
drwxr-xr-x root/root         0 2007-09-06 19:14 ./usr/share/doc/libjpeg62/
-rw-r--r-- root/root      4730 2007-09-06 17:50 ./usr/share/doc/libjpeg62/copyright
-rw-r--r-- root/root      4182 1998-03-28 08:35 ./usr/share/doc/libjpeg62/changelog.gz
-rw-r--r-- root/root      8293 1998-03-28 08:34 ./usr/share/doc/libjpeg62/README.gz
-rw-r--r-- root/root      3847 2007-09-06 17:50 ./usr/share/doc/libjpeg62/changelog.Debian.gz
lrwxrwxrwx root/root         0 2007-09-06 19:12 ./usr/lib/libjpeg.so.62 -> libjpeg.so.62.0.0

$ dpkg --contents libjpeg62-armel-cross_6b-14_all.deb
drwxr-xr-x root/root         0 2009-05-26 05:38 ./
drwxr-xr-x root/root         0 2009-05-26 05:38 ./usr/
drwxr-xr-x root/root         0 2009-05-26 05:38 ./usr/share/
drwxr-xr-x root/root         0 2009-05-26 05:38 ./usr/share/doc/
drwxr-xr-x root/root         0 2009-05-26 05:38 ./usr/share/doc/libjpeg62-armel-cross/
-rw-r--r-- root/root       268 2009-05-26 05:38 ./usr/share/doc/libjpeg62-armel-cross/README
drwxr-xr-x root/root         0 2009-05-26 05:38 ./usr/arm-linux-gnueabi/
drwxr-xr-x root/root         0 2009-05-26 05:38 ./usr/arm-linux-gnueabi/lib/
-rw-r--r-- root/root    133464 2007-09-06 19:13 ./usr/arm-linux-gnueabi/lib/libjpeg.so.62.0.0
lrwxrwxrwx root/root         0 2009-05-26 05:38 ./usr/arm-linux-gnueabi/lib/libjpeg.so.62 -> libjpeg.so.62.0.0


あとは、通常のDebianパッケージと同様に変換後のパッケージをdpkgでインストールするだけです。

クロス開発用パッケージのインストール

$ sudo dpkg --install libjpeg62-armel-cross_6b-14_all.deb
未選択パッケージ libjpeg62-armel-cross を選択しています。
(データベースを読み込んでいます ... 現在 111980 個のファイルとディレクトリがインストールされています。)
(libjpeg62-armel-cross_6b-14_all.deb から) libjpeg62-armel-cross を展開しています...
libjpeg62-armel-cross (6b-14) を設定しています ...

/usr/arm-linux-gnueabi/lib/以下にライブラリがインストールされていることを確認できます。

インストールファイルの確認

$ ls -la /usr/arm-linux-gnueabi/lib/libjpeg.so.62
lrwxrwxrwx 1 root root 17 2009-05-26 05:39 /usr/arm-linux-gnueabi/lib/libjpeg.so.62 -> libjpeg.so.62.0.0


apt-crossを使用する方法

apt-crossというツールを使用すると、上記のDebianパッケージをダウンロード、dpkg-crossで変換、インストールという手順を自動でおこなってくれる上、依存関係の解決まで行ってくれます。Xなどの依存関係が複雑なパッケージをインストールするには、必須のツールです。

まずは、ツールをインストールします。

apt-crossのインストール

$ sudo apt-get update
$ sudo apt-get install apt-cross


libjpegをインストールする場合は、以下のようなコマンドとなります。

apt-crossを使用したライブラリのインストール

$ sudo apt-cross --install --arch armel --suite stable --mirror http://ftp.jp.debian.org/debian/ libjpeg62

ポイント

開発用パッケージ

あるライブラリをインストールし、そのライブラリを使用したプログラムを作成してコンパイルしたら「ヘッダファイルが見つかりません」というエラーになることがあります。そのような場合は、大抵そのライブラリ用のヘッダファイルを含んだ開発用パッケージをインストールしていないことが原因です。

あるライブラリの開発用パッケージは、ライブラリのパッケージ名に"-dev"を付けたものになっています。例えば、libjpeg62パッケージの開発用パッケージは、libjpeg62-devとなります。

クロス開発用のライブラリをインストールする際は、そのライブラリを使用した開発を行うことが多いので、開発用パッケージも同時にインストールするとよいでしょう。

apt-crossを使用して開発用パッケージをインストールするようにすれば、依存するライブラリパッケージもインストールしてくれるので便利です。

クロス開発用ライブラリのインストールパス

通常のホストPC用のライブラリのインストールパスは、/usr/lib/です。dpkg-crossを使用して変換したクロス開発用ライブラリの場合、ARM OABI用のライブラリの場合は/usr/arm-linux-gnu/lib/となり、ARM EABI用は/usr/arm-linux-gnueabi/lib/となります。

アーキテクチャごとに異なるディレクトリにインストールするため、異なるターゲット用の開発環境も一つのホストPCに共存することができます。

なお、ヘッダファイルのインクルードパスは、ホストPC用が/usr/include/、ARM OABI用が/usr/arm-linux-gnu/include/、ARM EABI用は/usr/arm-linux-gnueabi/include/となります。

ライブラリ以外のパッケージ

いくつかのライブラリでは、インストールするのにライブラリではなく、アプリケーションのパッケージに依存しているものがあります。例えば、libssl0.9.8は、debconfに依存します。

ところが、アプリケーションのパッケージをdpkg-crossで変換しようとしても、ライブラリやヘッダファイルを含んでいない場合、失敗します。以下は、cdebconfのパッケージを変換しようしたときの例です。

dpkg-crossで変換できないパッケージ

$ dpkg-cross --build --arch arm cdebconf_0.138lenny2_arm.deb
dpkg-cross: package cdebconf doesn't provide any useful files. Skipping.


そのような場合は、dpkg-crossの--convert-anywayオプションを使用することで、ダミーパッケージを作ることができます。

ダミーパッケージの作成

$ dpkg-cross --build --arch arm --convert-anyway cdebconf_0.138lenny2_arm.deb
dpkg-cross: package cdebconf doesn't provide any useful files, but
processing it anyway as requested


README以外何も含んでいないダミーパッケージができあがります。

ダミーパッケージの内容

$ dpkg --contents cdebconf-arm-cross_0.138lenny2_all.deb
drwxr-xr-x root/root         0 2009-05-28 08:08 ./
drwxr-xr-x root/root         0 2009-05-28 08:08 ./usr/
drwxr-xr-x root/root         0 2009-05-28 08:08 ./usr/share/
drwxr-xr-x root/root         0 2009-05-28 08:08 ./usr/share/doc/
drwxr-xr-x root/root         0 2009-05-28 08:08 ./usr/share/doc/cdebconf-arm-cross/
-rw-r--r-- root/root       261 2009-05-28 08:08 ./usr/share/doc/cdebconf-arm-cross/README


参考情報


Comments