Linuxemu
あけましておめでとうございます。今年も淡々と始めますか。
「Ruby port」の続き(でもないけど)。クリスマスにRuby 1.9がリリースされた。ちらっと聴いた話だと、YARVの実装にはpthreadが使われているらしいけど(将来的にはネイティブスレッドによる並列実行をサポートするらしい)、APEはpthreadに対応してないので、Plan9に移植するにはその辺もどうにかしないといけないのかな。
APEに代わるアプローチとしては、FreeBSDのようにLinuxバイナリを実行するエミュレータが考えられる。linuxemuは元々Russ Cox氏が開発していたものだが、現在も開発が進んでいて、動的ロードやネットワーキングのサポートが追加されている。Operaが動くらしい。すご!
linuxemuをコンパイルしてみようと思ったけど、自分の使っている環境は古いので、segattach/segbrkとかプロトタイプ宣言が微妙に違って、コンパイルできない。
何カ所か修正して、コンパイルが通ったので、LinuxマシンでコンパイルしたHello worldバイナリを実行してみる。まずは、静的リンクした場合。
fileコマンドによると、Plan9の8.outは"plan 9 executable"だが、LinuxのELFファイルは"ELF executable"と表示される。お、ちゃんと実行できた。
cpu% file 8.out 8.out: 386 plan 9 executable cpu% file hello hello: i386 ELF executable cpu% ./8.out hello Hello,world!
続いて、動的リンクの場合。む、動的リンカがないって言われるな。当然共有ライブラリもないから、Linuxから持ってこないといけないか。
cpu% ./8.out hello2 hello2: cant load interpreter: '/lib/ld-linux.so.2' does not exist
動的リンクは後回しということで、ダメもとでruby 1.9.0を試してみる。
まずは、Linux boxで、configure&makeする(stripしているのは特に意図なし)。
$ LDFLAGS=-static ./configure $ make $ strip ruby
しかし、
cpu% ./8.out ruby -v [3515227] syscall 191/ugetrlimit not implemented [3515227] syscall 149/sysctl not implemented [3515227] syscall 191/ugetrlimit not implemented [3515227] syscall 191/ugetrlimit not implemented [3515227] rt_sigaction: unsopprted signalflags 4000004 [3515227] rt_sigaction: unsopprted signalflags 4000004 [3515227] rt_sigaction: unsopprted signalflags 4000004 [3515227] rt_sigaction: unsopprted signalflags 4000004 [3515227] rt_sigaction: unsopprted signalflags 4000004 [3515227] rt_sigaction: unsopprted signalflags 4000004 [3515227] rt_sigaction: unsopprted signalflags 4000004 [3515227] rt_sigaction: unsopprted signalflags 4000004 [3515227] rt_sigaction: unsopprted signalflags 4000004 [3515227] rt_sigaction: unsopprted signalflags 4000004 [3515227] rt_sigaction: unsopprted signalflags 4000004 [3515227] rt_sigaction: unsopprted signalflags 4000004 [3515227] rt_sigaction: unsopprted signalflags 4000004 [3515227] rt_sigaction: unsopprted signalflags 4000004 [3515227] rt_sigaction: unsopprted signalflags 4000004 [3515227] rt_sigaction: unsopprted signalflags 4000004 [3515227] rt_sigaction: unsopprted signalflags 4000004 [3515227] rt_sigaction: unsopprted signalflags 4000004 [3515227] rt_sigaction: unsopprted signalflags 4000004 [3515227] rt_sigaction: unsopprted signalflags 4000004 [3515227] rt_sigaction: unsopprted signalflags 4000004 [3515227] rt_sigaction: unsopprted signalflags 4000004 [3515227] rt_sigaction: unsopprted signalflags 4000004 8.out 3515228: suicide: sys: trap: fault write addr=0x0 pc=0x000099a6
だめかぁ。足りないシステムコールを追加するだけでいけるのかな?
ちなみに、1.8.6は動きました。
cpu% ./8.out ruby -v [3520951] syscall 191/ugetrlimit not implemented ruby 1.8.6 (2007-09-24 patchlevel 111) [i686-linux] cpu% cpu% ./8.out ruby -e '5.times do |i|' -e 'puts i' -e 'end' [3521392] syscall 191/ugetrlimit not implemented 0 1 2 3 4
irbもOKです。
cpu% RUBYLIB=/usr/oraccha/lib/ruby/1.8 cpu% ./8.out ruby irb [3522528] syscall 191/ugetrlimit not implemented [3522528] syscall 205/newgetgroups not implemented [3522528] syscall 205/newgetgroups not implemented irb(main):001:0> 1 + 2 => 3 irb(main):002:0> 5.times do |i| irb(main):003:1* puts i irb(main):004:1> end 0 1 2 3 4 => 5
今さらlinuxemuのREADMEに目を通してみたけど、pthreadは動かないとあるな。