本ドキュメントはnewlib-1.10.x をベースにしてppcsim用のCライブラリとして
構築する方法を示したものです。
ppcsim Ver0.70以上+Cygwin1.3.3以上に対応するライブラリの構築方法です。
使用するシステムはCygwin1.3.3以上が望ましいのですが、他バージョン及び
Linuxなどの他システムでも、一部のシステムコールエミュレーションを使用しない
という制限下で使用可能です。
まず、最寄のサイトからnewlib-1.10.xのソースファイルをダウンロードしてください。
私はRedHatサイトの
を利用しています。
そして、「ppcsim用差分」を
ダウンロードします。
次に以下の手順でクロスコンパイルを行います。
ずっこけた場合は、原因を調べて適当に対処してください(^^;
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
パッチについて補足します。
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パッチとして書いた