テストの前に、仕方なくnewlib

  1. 仕方ないので標準ライブラリを
  2. syscall.cをいぢる
2002.03.05 記 新井

仕方ないので標準ライブラリを

コンテキスト周り、割り込み処理が片付いたので、後は(ITRONで言う所の)例 外処理さえ押えれば終りだ。

で、Ryuz氏の例外処理の実装(今までの流れから見るとARMベースか?)が公開 されるまでは寝て待ってるという選択もあるが、それはあまりに情けないので、 暇にまかせてしみじみとHOS V4のITRON APIをチェックしていくことにしたら どうかと思ったのだった。

さて、どうチェックしていくか。全てのサービスコールについてサンプルでも 作らなければならないかと思っていたら、さすが"標準"を規定するITRON、検 定仕様書が存在するとの情報をRyuz氏からいただいた。

http://www.itron.gr.jp/SPEC/mitron4-j.html#ITRON4-TEST
からPDFファイルが持ってこられる。ウゲッ、テキストがキャプチャ出来ん… プレーンテキストかHTMLであればありがたかったのだが…。

で、これを読んでみると、別にCのソースコードが載っていて、「〜というコー ドを実行して、〜という結果を得られれば合格」という形にはなっていなかっ た。一例を挙げるとこんな風である。

テスト手順の例(ITRON4.0検定標準書より)

あう〜。一応、気持ちは分からないでもないけど、ここから実際のコードを書 いていかねばならんのね。

Ryuzさんが「…体力的に…」とおっしゃるのも無理はない。こんなのが山ほど あるんだから。

"標準"って、やはりコストのかかるものなのだなぁ…。

でもま、暇に任せてやる分には問題無いか。

そういう感じで検定標準書をボチボチなぞってみようかと思い立ったのだが、 折角なのでそのソースは極力、"標準の"ライブラリコール(なんて言っても主 にprintfだけだが)で書きたくなった。自前のscif出力ルーチンにそれらしい 皮を被せるのでも構わないのだが、書式なんかを考え始めると非常に欝な気分 になってしまう。newlibを入れる日が来たようだ。

newlibは、ANSI Cライブラリ、算術ライブラリが含まれたものである。こいつ を導入すれば、printf族やstr族、その他各種算術関数が使えるようになる。

そこでgoogle.comでnewlib ftpをキーワードに検索した所、とあるディレクト リにヒットしたので、そこから

newlib-1.10.0.tar.gz (3647395bytes/MD5 = 4fb57dfbe987826f4ef56a7c5ca571ba)

をゲットしてきた。ヒエェ〜!3.5MBだよ!

後はおなじみの作業だ。

まずはゲットしてきたアーカイブを展開。元が元だけにかなりデカイ。

frodo% tar xzf newlib-1.10.0.tar.gz

お次はディレクトリを掘ってconfigure。

frodo% mkdir sh-hitachi-elf
frodo% cd sh-hitachi-elf
frodo% ../newlib-1.10.0/configure --prefix=/usr/local --target=sh-hitachi-elf
Configuring for a i386-unknown-freebsd4.3 host.
*** This configuration is not supported in the following subdirectories:
     target-libgloss
    (Any other directories should still work fine.)
Created "Makefile" in /usr/home/m-arai/work/gnu/sh-hitachi-elf
Configuring texinfo...
No configuration information in texinfo
Configuring etc...
creating cache ../config.cache
checking for a BSD compatible install... /usr/bin/install -c
updating cache ../config.cache
creating ./config.status
creating Makefile

で、make。勿論、makeはFreeBSD標準のmakeではなく、port/packageから入れ たgmakeだ。

frodo% gmake
gmake[1]: Entering directory `/usr/home/m-arai/work/gnu/sh-hitachi-elf/etc'
gmake[1]: Nothing to be done for `all'.
gmake[1]: Leaving directory `/usr/home/m-arai/work/gnu/sh-hitachi-elf/etc'
Configuring in sh-hitachi-elf/newlib
…
sh-hitachi-elf-ranlib libc.a
ln libc.a libg.a >/dev/null 2>/dev/null || cp libc.a libg.a
rm -rf tmp
rm -f crt0.o
ln libc/crt0.o crt0.o >/dev/null 2>/dev/null \
 || cp libc/crt0.o crt0.o
gmake[2]: Leaving directory `/usr/home/m-arai/work/gnu/sh-hitachi-elf/sh-hitachi-elf/newlib'
gmake[1]: Leaving directory `/usr/home/m-arai/work/gnu/sh-hitachi-elf/sh-hitachi-elf/newlib'

つつがなく出来たので、install。

frodo% su
Password:
frodo# gmake install
/bin/sh ../newlib-1.10.0/mkinstalldirs /usr/local /usr/local
gmake[1]: Entering directory `/usr/home/m-arai/work/gnu/sh-hitachi-elf/etc'
gmake[1]: Nothing to be done for `install'.
gmake[1]: Leaving directory `/usr/home/m-arai/work/gnu/sh-hitachi-elf/etc'
…
mkdir /usr/local/sh-hitachi-elf/include/machine
mkdir /usr/local/sh-hitachi-elf/include/sys
gmake[3]: Leaving directory `/usr/home/m-arai/work/gnu/sh-hitachi-elf/sh-hitachi-elf/newlib'
gmake[2]: Leaving directory `/usr/home/m-arai/work/gnu/sh-hitachi-elf/sh-hitachi-elf/newlib'
gmake[1]: Leaving directory `/usr/home/m-arai/work/gnu/sh-hitachi-elf/sh-hitachi-elf/newlib'


syscall.cをいぢる

つつがなくinstallしてしまったが、str族や算術関数はともかく、ファイルス トリームに関する入出力を伴う関数はそのままでは使える筈もない。手を入れ よう。

どこに手を入れるかというと、そこはズバリ newlib-1.10.0/newlib/libc/sys/sh/syscalls.cである。中を読めば分かるが、

…
int
_read (int file,
       char *ptr,
       int len)
{
  return __trap34 (SYS_read, file, ptr, len);
}
…

trapa #34に実装されたシステムコールを呼び出すものに他ならない。この内 の_readと_writeをひったくり、その他の無関係な奴は適当に0とか-1を返すだ けのものにしてやる。

さらに、ヒープを伸ばして領域を取るシステムコール_sbrk()に関しても、ヒー プとスタックの衝突を検出してabortする部分を殺す。そうしないと、スタッ クを.dataに移すHOSとしては、いつもabortになってしまうからだ。 そういった辺りをいい加減にやったのが、

syscalls.c.html
である。極めていい加減。

実際の入出力に関してのコードをlibc内に入れてしまうのは気が向かなかった ので、ユーザプログラムの中において

/* 指定バイト読み込む */
__read( char *ptr, int len);

/* 指定バイト書き込む */
__write( char *ptr, int len);

という感じで書けばOKという風にした。

この項終り