newlib-1.10.x for ppcsimの作り方&使い方

目次

  1. はじめに
  2. コンパイル
  3. 使い方
  4. 注意点
  5. その他
  6. 履歴

はじめに

本ドキュメントはnewlib-1.10.x をベースにしてppcsim用のCライブラリとして 構築する方法を示したものです。
ppcsim Ver0.70以上+Cygwin1.3.3以上に対応するライブラリの構築方法です。 使用するシステムはCygwin1.3.3以上が望ましいのですが、他バージョン及び Linuxなどの他システムでも、一部のシステムコールエミュレーションを使用しない という制限下で使用可能です。

コンパイル

まず、最寄のサイトからnewlib-1.10.xのソースファイルをダウンロードしてください。 私はRedHatサイトの を利用しています。
そして、「ppcsim用差分」を ダウンロードします。

次に以下の手順でクロスコンパイルを行います。

  1. PPCクロスgccおよびbinutilsを構築し、使用できる状態にします。 「クロスコンパイラの作り方 」 を参考に構築してください。

  2. ダウンロードしたnewlibソースファイルを適当なディレクトリに展開してください。 以下、newlib-1.10.0.tar.gzを展開したとして話を進めます。

  3. ディレクトリ「newlib-1.10.0/newlib」に移動して、./configureを実行します。 ターゲットなどは指定しなくて構いません。

  4. newlib-1.10.0/newlib/libc/machine/powerpc の下に移動して、./configureを 実行します。終了したら、cd ../../../ でnewlibディレクトリ下に戻って ください。

  5. newlibディレクトリ下で 「ppcsim用差分」を 展開します。

  6. mk.shというシェルスクリプトが用意されています。必要があればエディタなどで 「export BINDIR=/usr/local/powerx/bin」を1.で用意した クロスコマンド群のインストールされたディレクトリに変更します。 「export TARGET=powerpc-powerx-elf-」はbinutils及びgccのクロスコンパイル で指定したターゲット名が入ります。もし変更があればこちらも合わせて 変更します。
    注意点として、BINDIR=で指定するディレクトリは絶対パス指定を行って下さい。 newlibのmakeはディレクトリを行き来するため、相対パスにするとコマンドが 見えなくなって、コンパイラが起動できません。

  7. mk.shを実行すると、コンパイルが開始されます。 crt0.o,libc.a,libg.a,libm.a が生成されるとコンパイル完了です。
    適当なディレクトリを作成し、これらのライブラリ一式と、クロスgccの構築時 に生成されるlibgcc.aをまとめて入れておくと良いでしょう。
    ヘッダファイルは libc/include 下をそのまま使用します。これも、適当な ディレクトリに丸ごとコピーするなり、シンボリックリンクを利用するなり して、適当なパスに移しておくと良いかも知れません。

ずっこけた場合は、原因を調べて適当に対処してください(^^;

使い方

includeファイルは newlib/libc/include 以下のファイルをそのまま使用します。 gccの-Iオプションで指定するようにしてください。
以下はMakefileの例です。

SHELL=/bin/sh

TOOLPREFIX= /usr/local/powerx
LIBPATH   = $(TOOLPREFIX)/ppclib/lib
INCPATH   = $(TOOLPREFIX)/ppclib/include
BINPATH   = $(TOOLPREFIX)/bin
TARGET    = powerpc-powerx-elf-

CC    = $(BINPATH)/$(TARGET)gcc -B$(BINPATH)/
OPT   = -Wall -O2 -mcpu=750 #-v -dr
#OPT   = -O0 -g #-v -dr
CFLAGS= $(OPT) -I. -I$(INCPATH)
LD      = $(BINPATH)/$(TARGET)ld -V -Qy -dn -Bstatic -Ttext 0x10000 

LDFLAGS = -Map map.log

foo.s: foo.c
foo.o: foo.c
foo: foo.c

%.s:%.c
        $(CC) -S $(CFLAGS) $<

%.o:%.c
        $(CC) -c $(CFLAGS) $<

%:%.c
        $(CC) -c $(CFLAGS) $<
        $(LD) $(LDFLAGS) $(LIBPATH)/crt0.o \
        $*.o -L$(LIBPATH) -lc -lm \
        $(LIBPATH)/libgcc.a -o $@
%.bin:%
        bcut -s 0x10000 $< > $*.bin
        $(BINPATH)/objdump --source $< > $*.dis



TOOLPREFIX,LIBPATH,INCPATH,BINPATH,TARGETをインストールしたディレクトリに 書き換えれば基本的にOKです。foo.c というソースファイルがあった場合、 make fooと実行すればOKです。例としてfooとなっていますが、実はこの Makefile、fooを生成する為のMakefileの様に見えて、make hoge とやって もうまくhogeをmakeしてくれます。なんだかちょっと謎めいていますが、 結果オーライという感じでしょうか(^^;

注意点

パッチについて補足します。
opendir(),readdir()はppcsimでエミュレーションを行う際に少々特殊な対応を 行っているため、パッチソースの適用が必須になっています。各ソースでは、 dirent.hからsys/dirent.hをインクルードしていますが、Cygwin1.3.3からstruct dirent のメンバが変更になっており、それとの整合を取る必要があるためバージョン 依存となっています。逆にopendir(),readdir()を使用しなければ、バージョンには 依存せず使用できるハズ(未確認)です。

configure実行後にmk.shを実行すると、libc/time/Makefileおよび libm/machine/Makefileを書き換えます。ibc/time/Makefileの書き換えでは、 -DHAVE_GETTIMEOFDAYをデファインオプションとして追加し、 libm/machine/Makefileの書き換えでは、machine依存チューニングライブラリの make起動を抑止しています。いずれも最初のconfigureターゲットがCygwinと なっているのが理由だったりしますが、現時点ではこれでしのいているという 事でご了承願います。

その他

ppclib2ではスタートアップをstart.oとしていましたが、crt0.oをmakeする 様に変更しました。ただ、syscallライブラリをsys/powerxの下に入れるのは 作法に外れていると思いますが。
システムコールは libc/include/powerx/syscalls.hで定義されている通りです。 glibcのsysdepから拾ってきたLinuxシステムコールから、必要最低限と思われる ものと、コンパイルテスト中にどうしても必要となったものを追加しています。

履歴

  2001/03/29 newlib-1.9.xパッチとして書いた
  2002/05/12 newlib-1.10.xパッチとして書いた


TOP PREV