2009-03-13
■ perl から任意の C ライブラリを呼び出す方法
syscall って組込関数でシステムコールはできますけど、libc やその他ライブラリの関数を呼びたい、ってこともありますよね。i386 かつ dlopen な環境なら、こんな風に書けます。
use DynaLoader; use ops; sub ccall { my $r = '1111'; my $s = "\x68" . pack("L", $_[5]) . "\x68" . pack("L", $_[4]) . "\x68" . pack("L", $_[3]) . "\x68" . pack("L", $_[2]) . "\x68" . pack("L", $_[1]) . "\xb8" . pack("L", ("Dyna"."Loader")->can("dl_find_symbol")->(("Dyna"."Loader")->can("dl_load_file")->("libc.so"), $_[0])) . "\xff\xd0" . "\x83\xc4\x14" . "\xa3" . pack("p", $r) . "\xc3"; my $p = pack("P" . length($s), $s); my $f = "my$_[0]"; ("Dyna"."Loader")->can("dl_install_xsub")->($f, unpack("L", $p)); &$f(); unpack("L", $r); } # 実際の呼び出し print ccall("stat", unpack("L", pack("p", "/")));
トラックバック - http://d.hatena.ne.jp/kazuhooku/20090313/1236931258
リンク元
- 94 http://reader.livedoor.com/reader/
- 49 http://d.hatena.ne.jp/
- 27 http://b.hatena.ne.jp/hotentry/it
- 25 http://subtech.g.hatena.ne.jp/miyagawa/20090313/1236932941
- 21 http://b.hatena.ne.jp/
- 21 http://b.hatena.ne.jp/entrylist
- 19 http://okyuu.com/ja/tips/5601
- 14 http://www.google.com/reader/view/
- 10 http://b.hatena.ne.jp/entry/http://d.hatena.ne.jp/kazuhooku/20090313/1236931258
- 9 http://www.google.co.jp/reader/view/
