Desarrollar y descargar software de código abierto

View ユーザーランドの構築

category(Tag) tree

file info

category(Tag)
raíz
file name
userland
la última actualización
2002-05-02 21:59
tipo
HTML
editor
佐藤 嘉則
descripción
ユーザーランドのコンパイル方法の説明です。
idioma
Japanese
translate

ユーザーランドの構築方法

ユーザーランドをコンパイルするために必要な情報を整理しました。
uClibc回りはうそがあるかもしれません。


コンパイル環境の構築

基本的にはH8/300クロス開発環境です。

ただし、最終的に生成されるバイナリに再配置情報が必要なので、 binutilsにパッチをあてる必要があります。
その他、ライブラリの問題もあるので、違うターゲット名を指定するなどの方法で、 専用のコンパイル環境を作った方が後々楽が出来ると思います。

binutils

binutils-2.11.2.patch 2.12用はまだ作ってません。
コンパイル手順
$ tar xzf binutils-2.11.2.tar.gz
$ cd binutils-2.11.2
$ patch -p1 < binutils-2.11.2.patch
$ ./configure --target=h8300-hitachi-hms
$ make

パッチをあてててから、H8/300のクロス開発用でビルドしてください。 configureのオプションは、環境に合わせて適当に変更してください。
objcopyとobjdumpにもパッチをあてていますが、必須ではありません。
libbfd.aとlibiberty.aは後で使います。削除しないで下さい。

gcc

普通にH8/300のクロスコンパイラとして作ってください。
$ tar xzf gcc-3.0.4.tar.gz
$ cd gcc-3.0.4
$ ./configure --target=h8300-hitachi-hms \
              --enable-languages="c,c++" --without-newlib
$ make

newlibを使わないので、これでコンパイルできるはずです。 ただし、最近作っていないので、ひょっとしたら間違っているかもしれません。

coff2f;t

coff → Flat Binaryのコンバータです。uClinuxはCOFFのバイナリを読めないので、 これを使って読めるフォーマットに変換します。

ソースは、 coff2flt-0.5.tar.gzにあります。
で、これはm68k用なので、H8/300用のパッチが必要です。
coff2flt-0.5.patch

コンパイル手順
$ tar xzf coff2flt-0.5.tar.gz
$ cd coff2flt-0.5
$ patch -p1 < coff2flt-0.5.patch
(LDFLAGSを修正)
$ make

単純にコンパイルすると、 システムに標準で用意されているBFDライブラリをリンクしてしまうので、 makeする前に、H8/300用のBFDライブラリがリンクされるように、 LDFLAGSを修正します。
これを忘れると使えないcoff2fltが出来てしまうので、注意してください。

よくわからない場合は、binutils-2.11.2/bfd/libbfd.aと binutils-2.11.2/libiberty/libiberty.aをcoff2flt-0.5にコピーして、
LDFLAGS = -L ./ -lbfd -liberty
と、修正してからmakeすれば、通るはずです。


おまけで、コンパイル済みバイナリを置いておきます(i386/glibc2.1)。 どうしても動かない場合は、使ってください。

genromfs

ROMFSを使わなければ不要です。
H8/300用パッチはありません。その辺からダウンロードしてきてコンパイルしてください。
ここにも genromfs-0.3.tar.gzがあります。 探せば、パッケージもあると思います。

ライブラリの構築

uClibcを使います。

uClibc-0.9.9.tar.bz2を、ダウンロードしてください。

もっと新しいのも出ていますが、全然テストしていないので(ごめんなさい)、 動くかどうかわかりません(0.9.10はコンパイル出来ません。0.9.11は未確認)。
ただ、0.9.9もptraceがバグ付なので、 ptrace.cはCVSの最新と入れ換えた方がいいと思います。

コンパイル方法は、readmeを読んで下さい。 おおよその手順は、
  1. extra/Configs/Config.h8300をトップディレクトリにConfigという名前で コピーしてください。
  2. Configの変数を環境に合わせて変更してください。
    CROSS クロスコンパイラのプレフィックス(H8300-hitachi-hms-とか)
    KERNEL_SOURCE カーネルソースのディレクトリ名
    DEVEL_PREFIX ヘッダ、ライブラリ、コンパイラドライバのインストール先
    とりあえずこの3つを環境に合わせて設定すればライブラリは出来るようです。
  3. make
  4. rootになってmake install
ということらしいです。実はよくわかっていない所がある

newlibを使っている場合は、上書きしてしまわないように注意してください。

h8300-uclibc-gccとh8300-uclibc-ldというドライバが出来るので、 これを使うと楽できるのかもしれませんが、私は使っていないので、よくわかりません。
オプションを自動的に追加してくれるようです。

これで、ユーザーランドのコンパイル環境は完成です。

コンパイル方法

準備が終わったので、やっと本題のコンパイル方法に入れます。
基本的には、他のアーキテクチャと同じ手順でコンパイルできます。 m68kの情報も参考になると思います。
流れとしては、
  1. コンパイル
  2. リンク
  3. FlatBinaryへ変換
です。普通のH8/300クロス開発とほぼ同じです。

コンパイル

ごく普通にコンパイルしてください。
このとき、いくつかのオプション指定が必須になります。
-mh -mint32 -fsigned-char -Wl,-embedded-relocs(リンク迄行う場合)
付けなかった場合、ライブラリ、カーネルとの整合性が取れなくなって、 妙なことが起きるかもしれません。

リンク

gccを使ってリンクする時は、同じく、
-mh -mint32 -fsigned-char -Wl,-embedded-relocs(リンクする場合)
を指定してください。
ldを直接呼ぶ場合は、
-m h8300h --embedded-relocs
を指定してください。
忘れると、再配置情報が生成されません。

FlatBinaryへ変換

coff2fltでFlatBinary形式に変換します。使い方はhelpを見ればわかると思いますが、
$ coff2flt -o 出力 入力
です。


イメージファイルの作り方

出来上がったプログラムを持っていくには、今の所、
  • ROMFSのイメージに入れる
  • NFSでサーバーのディスクをマウント
という手段しかありません。
で、このイメージの作り方を簡単に説明します。

作成方法

  1. 適当なディレクトリをルートにして、/bin,/dev…の各ディレクトリを作成します。
    雛形代わりに、テスト用ルートイメージの元を用意しました。参考にしてください。
  2. ファイルを適当に配置します。
  3. genromfsで、ファイル形式に変換します。
    $ genromfs -f 出力ファイル名 ルートディレクトリ名
    で、変換できます。
で、出来上がったファイルを、それなりの場所に読み込んで起動すると、 マウントされて、中が見えるようになります。

注意事項

当然のごとくサイズの制限があります。現在は、最大448KBです(半端だ)。
ロードアドレスとサイズは、ldscriptで指定しているので、カーネルのサイズ、 起動後の空きメモリ容量と相談して、指定をを変更してください。
arch/h8300/platform/h8300h/aki3068net/ram.ldの
rdisk : ORIGIN = 0x4A0000, LENGTH = 0x70000
です。 修正した場合は、uramセクションの指定も修正してください。
本当は、カーネルコンフィグレーションで変更できるようにしたいんですが、 まだ、そこまで手が回りません。

おまけ

カーネルにイメージファイルをリンクしてしまえば、限界までメモリを有効利用できます。 かわりに、ファイルサイズの肥大化により、ダウンロード時間が延びてしまいますが。
それでもいいという人は、以下の作業を行ってください。リンクできるようになります。
  1. objファイルに変換
    h8300-hitachi-hms-objcopy --adjust-vma=0x88000 --adjust-arch=h8300h \
    --adjust-mach=2 --add-section .rootimg=ルートイメージ(バイナリ) \
    --remove-section .data -I binary -O coff-h8300 ルートイメージ(バイナリ) \
    ルートイメージ(オブジェクト)
    という、呪文のようなコマンドで、バイナリをobjに変換できます(要パッチ)。 <li>ldscriptの変更生成されたイメージのobjをリンクされるように変更する。 makefileか、ldscriptを修正して、リンクされるようにしてください。
この修正を行った後、カーネルを構築すれば、イメージがリンクされるはずです。
うまく行かない場合は、arch/h8300/platform/generic/rom.ldを参照してください。

最後に

以前に書いた文章を、もう少しわかりやすくした…つもりですが、 あまり変わっていないような気が…。

uClinuxとH8/300Hに固有な部分はそれほど無い(はず)なので、 他のアーキテクチャでのクロスコンパイルの情報を参考にすれば、 何とかなるんじゃないかと思ってます。

ということで、誰かBusyBoxをコンパイルしてください。あれが動けば、 ユーザーランドの構築がだいぶ楽になりそうなので。

各種指摘・質問・「書き直してやったぞ」というありがたい報告等は、 出来ればML に送ってください。
特にuClibcのところ。


Project Page
Yoshinori Sato