CPU実験室

誰も見向きもしない古いCPUをいじって動かしてみようというプロジェクトです

ライブラリ動作不良

簡単な数値演算処理を含むプログラムをgccコンパイルしてみると
浮動小数点どころかintの乗算・除算もエラーになることがわかりました。

生成されたソースコードを見てみるとintの乗算・除算のとき
ライブラリLIBGCC.A内の関数をコールするようになってますが、
そこからさらに下請けの関数を呼ぶ部分のバイナリコードが


000401C0 BSR $000401C1
000401C2 ORI.B #$22,D0
  :
000401D0 BSR $000401D1
000401D2 ORI.B #$72,D0


となっていて、これでは奇数番地にジャンプしてしまいアドレスエラー例外が発生するのは当然です。
最初はリンカがアドレスの解決ができないのだと思いリンカスクリプトを見なおしても問題無し。
でメモリダンプしてみると


000401C0 61 FF 00 00 00 22 50 8F 22 2F 00 08 2F 01 2F 00
000401D0 61 FF 00 00 00 72 50 8F 22 2F 00 04 92 80 20 01


よくみると『61/FF/00/00/00/22』が『BSR (PC)$00000022L』という1個の命令であることに
気付きました。
『61』の次の『FF』が32ビットPC相対アドレスを示しますが、ところがこれはMC68020以降の命令。
一方MC68000では8ビットまたは16ビットPC相対しか使えないので『61/FF』を
そのまま8ビットPC相対アドレスと見て『BSR (PC)$-1』と解釈してしまったようです

つまりライブラリがMC68020用にビルドされてしまっているというのが正解でした。