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は動かないとあるな。