クロスコンパイル環境の構築(ホスト:PowerPC, ターゲット:ARM9の場合)

目標: PowerPC Linux 上で ARM9 Linux 用のプログラムをコンパイルする。情報は2008.05.08のもの。

クロスコンパイル環境を作るにあたって

ホストアーキテクチャPowerPC(PowerMac G5)
ターゲットアーキテクチャARM9(玄箱/PRO)

GNU のコンパイラの基本的な構成要素は以下の 3 つ。

  1. binutils
    アセンブラ・リンカ・バイナリ操作プログラムなど
  2. gcc
    コンパイラ
  3. libc
    C の標準的なライブラリ

binutils と gcc をまとめて「ツールチェイン(toolchain)」とも呼ぶ。

今回は、crosstool を用いてクロスコンパイル環境の構築を行う。crosstool は、Dan Kegel 氏が作成したクロスコンパイル用 gcc、glibc の自動生成スクリプト集。PowerPC など多くのプラトフォームと、gcc と glibc の組合せに対応している。

クロスコンパイル環境の構築(main)

  • crosstool のダウンロード
  • スクリプトの実行
    • 事前に root 権限でユーザ権限の crosstool 用のフォルダを作成しておく。
      $ sudo mkdir /opt/crosstool
      $ sudo chown $USER /opt/crosstool
    • コンパイルには bison と flex も必要なので事前にインストールしておく。
      $ apt-get install bison flex
    • 今回は、ターゲットCPUがARM9なので、ARM9用のスクリプトを実行する
      $ cd crosstool-0.43
      $ sh demo-arm9tdmi.sh
      実行するとFTPダウンロード~展開するまで 60 分程度かかった。
      ※sh demo-arm.sh(unknown版)でも玄箱/PRO上で正しく動作した。arm9tdmi版との違いはわからない。
  • パスを通す
    • コンパイルが正常終了したら、bin フォルダにパスを通す(ホームの .bashrc を編集する)
      (~/.bashrc の末尾に追記)
      PATH="$PATH:/opt/crosstool/gcc-4.1.0-glibc-2.3.2/arm-9tdmi-linux-gnu/bin"
    • 保存後、.bashrc をすぐに反映したい場合(source の代わりに . 1文字だけも同義)
      source ~/.bashrc
  • hello.c をクロスコンパイル
    • hello.c を作成
      #include <stdio.h>
      main () {
      	printf ("Hello world !\n");
      	return 0;
      }
    • hello.c のコンパイル
      シェアードライブラリを使用する(通常のコンパイル)
      arm-9tdmi-linux-gnu-gcc -o hello-arm9 hello.c
      これで hello-arm9 という名前で ARM9 上で実行可能なファイルがコンパイルされる。
      スタティックリンクの場合(関数のコードを実行ファイルに組み込むため、動くマシンは多くなるがファイルサイズはかなり大きくなる)
      arm-9tdmi-linux-gnu-gcc -static -o hello-arm9-static hello.c
    • file コマンドでコンパイルされた内容を確認できる。
      $ file hello-arm9
      hello-arm9: ELF 32-bit MSB executable, ARM, version 1 (ARM), for GNU/Linux 2.4.18,
      dynamically linked (uses shared libs), for GNU/Linux 2.4.18, not stripped
    • 玄箱/PRO に hello-arm9 をコピー、実行権限を与えて実行してみる → 成功!
      $ ./hello-arm9
      Hello World !
      今後、カーネルのコンパイルにもチャレンジしたい。

ハマったところ

  • クロスコンパイル環境を構築する際には、Pylone社が提供している apt-cross という便利パッケージを利用するとインストールが簡単とあった。しかし、apt-cross でのインストールは i386 系しか対応していないことを知らずに一生懸命 PowerPC で対応しようとしてしまった(2時間のロス)
  • スーパーユーザでコマンドを実行する sudo コマンドをユーザが実行できるようにするには、事前に root 権限で
    $ visudo
    で、権限を与えるユーザを追加しておく必要があることを知らなかったため、実行できないコマンドがあった。さらに、sudo コマンド実行時に求められるパスワードは root のものでなく、実行したユーザのパスワードであることに注意。
  • crosstool の実行中にユーザ権限がないためにchmodができないエラーが発生した。root権限で
    $ chown (ユーザ名) crosstool*
    を行うことで対処した。
  • crosstool の実行中に以下のエラーが発生
    /home/(username)/crosstool-0.43/crosstool.sh: line 110: bison: command not found
    crosstool: You don't have bison installed
    bison を apt-get でインストールする。同様に次にエラーになりそうな flex もこのタイミングでインストールしておく。

参考リンク


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2008-06-22 (日) 16:01:25 (519d)