tokuhirom's Blog

DynaLoader に関する基礎知識

Perl で XS をよむには DynaLoader か XSLoader をつかうのだが、XSLoader は DynaLoader を簡単によぶためのラッパーにすぎない。いうなれば ExtUtils::MakeMaker にたいする Module::Install のようなものだ。

DLL に対応した perl はDynaLoader をくみこんでいるので、DynaLoader.pm はなくても XS でかかれた部分は普通につかえる。DynaLoader::boot_DynaLoader() すると、DynaLoader::* の関数のうち XS でかかれたものはよべるようにセットアップされる。

DynaLoader の利用を禁止したい場合には、本質的な解決策としては、必要な XS module を static link して、dynamic loading を禁止した perl をコンパイルしてつくるのがいいだろう。

また、'DynaLoader' という文字列の実行が禁止されているというような環境では、

*{'Dyna'.'Loader::dl_install_xsub'}{CODE}->();

のようにすると、使えるので、そのような環境での実行時にはこのようなテクニックを積極的に利用したいところである(なお、このような制限は双方にとってめんどくさいだけなので、かけない方がいいとおもわれる)。