2008/10/05(日)[GCC] SH2環境不具合疑惑(自己完結)

前ふり

066にて,SH-ELF-GCC環境を準備した.
ところが,コレには不具合がある模様で,buildできないと思われる.記事作成中にふと思い立って解決した.とりあえず経緯だけでも残しておく.outputとして,TOPPERS環境への反映を行うことにする.

問題点

TOPPERSのconfigureにより,targetサンプルプログラムを作る.のちほどまとめ記事を作成するが,CQ-SH7144向けのポーティングをしたものだ.
コンパイルがとおることまでは確認できたが,下記のとおりリンクエラーが生じる.

sample1.o: In function `main_task':
/home/XXX/asp/app02/sample1.c:352: undefined reference to `___udivsi3_i4i'
log_output.o: In function `convert':
/home/XXX/asp/app02/../library/log_output.c:65: undefined reference to `___udivsi3_i4i'
collect2: ld returned 1 exit status
make: *** [asp.exe] Error 1

KPITのWEB pageでは,sh-elf-ldへの引数で,-L -lオプションの記述がまずい場合に起こりえる旨,記述があった.しかし,今回はそうではなさそうだ.

釈迦に説法だと思うが,errorの意味としては,リンク時にlog_output.cの65行目で___udivsi3_i4iというラベルが見当たらないよ?という意味である.


解決手段

リンク時,リンカに対して,-nostdlibを指定している.これは,gccの和訳(勝手にリンク)によると,以下のとおり.

リンク時に標準システム・スタートアップ・ファイルや標準システム・ライブラリを使用しません。
スタートアップ・ファイルは一切リンカに渡されません。
指定されたライブラリだけがリンカに渡されます。

スタートアップルーチン等は,TOPPERSのarchitecture依存部で実装するため,gccの標準ライブラリは不要なためである.

そこで,-m2でSH2を指定したときだけに問題が見えていたため,以下のディレクトリにあるobjectを全て逆アセンブルしてみる.

usr/lib/gcc/sh-elf/4.3.2/m2
% sh-elf-objdump -Dtr foo.[ao] > foo.[ao].txt

便宜上,ワイルドカード表示にしてあるが,実際にはテキストエディタでエイヤと作成した.find --exec ...が正等かもしれないが,あんまり覚えてないので...
出力させたファイルをgrepしてみると,___udivsi3_i4iが見つかる.

libgcc-Os-4-200.a

居た・・・コイツか.確かに,リンク指定は-lgccとしか指定していない.とりあえず適当なところに下記の行を追加して試してみる.

LIBS := $(LIBS)  -lgcc-Os-4-200

なんの問題もなくbuild完了./(^o^)\ナンテコッタイ

GCC4.3.2環境でのみ生じる問題なのだろうか.TOPPERS/ASP kernelのSH12A architectureの動作保障がSH2でしか存在していないためなのだろうか.
ぶっちゃけ,cygwin環境でもう一度gccのフルビルドはしたくない...

それどころか,今回のポーティングやGCCの一部を追いかけることにより,HEW環境の立ち上げが最適解であるように感じられた.
gccはその汎用性が優先されている感を受ける.最適化範囲も,それほどglobalでは無いように思えるのだ.ADS/RVDSのようにレジスタ直行性も視野に入れてアサイン・命令の入れ替えをしてくれない(と思う).HEWは,メーカ謹製コンパイラを使っているのだから,そのアタリの最適化もしてくれているハズだろう(未確認).

おかげさまで,sh1/sh2/sh3での除算比較ができましたわ.とりあえずSH3未満だと除算命令やシフト命令のあたりで結構きつい制約があるように見受けました.また,SH2以下だと,汎用レジスタバンクが存在しないため,割り込み応答性能が劣るという問題を認識しました.

う~ん,結局動作クロックを挙げて,外部との境界にキャッシュを置くしかないんだろうな・・・.SH4ボードとか買ったほうが早そうだな.ALPHAの板が4万以下だから安いんだよな.
安いといっても,玄人箱が2台も買えるのだが('A`


足掛け三日ほど悩んでいました.下らんことでハマるハマる...