perl で fork をよぶ方法(linux x86 編)
use DynaLoader;
my $s = join('',
"\x31\xc0", # xor %eax,%eax
"\xb0\x02", # mov $0x2,%al
"\xcd\x80", # int $0x80
"\xc3", # ret
);
DynaLoader::dl_install_xsub(
'myfork',
unpack("L",pack("P*",$s))
);
&myfork;
linux で perl から fork をよぶにはこうすればいいという話。
dl_install_xsub をこのように呼ぶと、任意の x86 コードが実行できるので、好きなように system call などを呼ぶとよい。
linux でシステムコールをよぶには、eax レジスタにシステムコール番号をいれて、ebx レジスタなどに引数をいれて、int 80h をよべばいい。
as hoge.s && ld -s -o foo a.out && ./foo
などとすると、ためしにうごかしたりできるが、この途中の a.out を objdump -D すると、ディスアセンブルされるので、これをコピペして、つっこんだりしていた。
たぶんもうちょいうまいやりかたがあるのだとおもう。
なおこれは fork などが制限されている perl での場合で、通常には fork() builtin function をつかえばよい。
Published: 2009-03-12(Thu) 17:02