CPU実験室

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

Cygwin環境でGCC(2)

というわけでスクリプトを修正してリトライ。
 
$ ./gc.sh test
Reading specs from /usr/local/m68k/lib/gcc/m68k-coff/3.4.2/specs
Configured with: ./configure --prefix=/usr/local/m68k --target=m68k-coff --with-newlib
Thread model: single
gcc version 3.4.2
 /usr/local/m68k/libexec/gcc/m68k-coff/3.4.2/cc1.exe -quiet -v -I/usr/local/m68k/include test.c -quiet -dumpbase test.c -m68040 -auxbase test -O -version -o test.s
ignoring nonexistent directory "/usr/local/m68k/lib/gcc/m68k-coff/3.4.2/../../../../m68k-coff/sys-include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/local/m68k/include
 /usr/local/m68k/lib/gcc/m68k-coff/3.4.2/include
 /usr/local/m68k/lib/gcc/m68k-coff/3.4.2/../../../../m68k-coff/include
End of search list.
GNU C version 3.4.2 (m68k-coff)
        compiled by GNU C version 4.9.3.
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
GNU assembler version 2.16.1 (m68k-coff)
test.o:test.c:(.text+0x6): undefined reference to `__main'
m68k-coff-objcopy: 'test.obj': No such file
 
おおお、通ったか・・と思いきやリンカが関数「__main」が解決しないといって止まってしまいました。
 
ここでちょっとリンクされるモジュールを確認しておきます。
 
まず、スタートアップルーチンstart.。
これは自前で用意したもので見てのとおり処理の本体main()のエントリーポイントに飛ぶだけ(帰ってきたらトラップしてボードの内蔵モニタを起動するくらい)
まったく何もしていないルーチンです

イメージ 1
 
何でこれがいるのかというと、これをモジュールの先頭にリンクしておくと処理本体main()のエントリーポイントがどこになろうが_startのエントリーポイントは必ずコード領域の先頭アドレス固定になるので、ボードに転送した時の実行開始アドレスがいつも同じになってくれるからです。
 
一方、処理の本体test.cのコンパイル結果test.sを見てみると
main()のエントリーポイントがmain。これがスタートアップルーチンから飛んでくるところで解決しています。
 
ですが、その直後に挿入されている「jbsr __main」ってこれ何?
 

 

イメージ 2
 
__mainは当然mainとは違うわけで、自前で用意したものでもないので
リンクされずにエラーになるのは明らかです。