jonesforthを見てますが、分からないことが沢山あるのでまだ具体的に進んで無いです。
64bit版はquekさんが既に作られてるということで、JavaのJVMかFlashのAVM2への移植を取り敢えずの目標にしてやっていこうと思います。quekさんのchocoforthはnasmで書かれていて、実装方法がjonesforthはIndirect Threaded Codeなのに対してDirect Threaded Codeというので実装されてるところが違うみたいです。さっぱり分かりませんが、gasとnasmとがあると比べて見れるのでとても参考になります。
まず真っ先に疑問に思ったのが、helloworldはコンパイルできるのに、jonesforthは何故asでコンパイルするとエラーが出まくるのかということ。
$ as -o jonesforth.o jonesforth.S
大量に出るので先頭だけ見てみる。
$ as -o jonesforth.o jonesforth.S 2> error.log
$ head -n 3 error.log
jonesforth.S: Assembler messages:
jonesforth.S:502: Error: too many positional arguments
jonesforth.S:503: Error: junk `//%eax points to codeword' after register
502行目付近はこんな感じ。
498 /* DOCOL - the interpreter! */
499 .text
500 .align 4
501 DOCOL:
502 PUSHRSP %esi // push %esi on to the return stack
503 addl $4,%eax // %eax points to codeword, so make
504 movl %eax,%esi // %esi point to first data word
505 NEXT
.macroや//のコメントが怪しい気がしたけど、helloworldに入れても動くしgasのちゃんとした機能だそうです。何がいけないのかな?
一旦それは諦めてgccでのコンパイル時のオプションの意味を調べてみた。
$ gcc -m32 -nostdlib -static -Wl,-Ttext,0 -Wl,--build-id=none -o jonesforth jonesforth.S
gccは-v --help
とやるとサブプロセスのオプションも全部だしてくれるそうなので一つずつ調べる。
$ gcc -v --help | grep m32
(...)
-m32 Generate 32bit i386 code
(...)
$ gcc -v --help | grep nostdlib
(...)
-nostdlib Only use library directories specified on
the command line
(...)
$ gcc -v --help | grep static
(...)
-Bstatic, -dn, -non_shared, -static
Do not link against shared libraries
(...)
$ gcc -v --help | grep Wl
(...)
-Wl, Pass comma-separated on to the linker
(...)
$ gcc -v --help | grep build-id
(...)
elf_i386:
--build-id[=STYLE] Generate build ID note
(...)
他は分かるけど最後のbuild ID noteって何だろう?
ldのオプションでelf_i386と書いてあるのでELFのフォーマットの中にそういう部分があるんだろうか?BINARY HACKSのELF入門やreadelf -aの出力を見てみたけどbuildなんたらというのは見つからなかった。
jonesforthインタプリタは-Wl,--build-id=none
というオプション無しでも普通に動いてしまう。
$ gcc -m32 -nostdlib -static -Wl,-Ttext,0 -o jonesforth jonesforth.S
$ cat jonesforth.f - | ./jonesforth
JONESFORTH VERSION 47
14499 CELLS REMAINING
OK
1 2 + .
3
謎だ・・・。
参照: