Blog

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 をつかえばよい。