DYNALOADER(3) USER COMMANDS DYNALOADER(3) NAME DynaLoader - C ライブラリを Perl のコードに動的ロードする dl_error()、dl_findfile()、dl_expandspec()、dl_load_file()、 dl_find_symbol()、dl_undef_symbols()、dl_install_xsub()、 boostrap() - DynaLoader モジュールで使用されるルーティン SYNOPSIS require DynaLoader; push (@ISA, 'DynaLoader'); DESCRIPTION このモジュールは、多くのプラットホームで利用可能な、動的リン クの仕組みとの標準的で一般的なインタフェースを定義するもので す。 その当初の目的は、Perl モジュールの自動的な動的ロード をインプリメントすることです。 DynaLoader は、とても単純で高レベルのインタフェースとなるよ う設計され、このインタフェースは、SunOS、HP-UX、NeXT、Linux、 VMS その他のプラットホームの要求をカバーするため、十分かつ一 般的なものです。 このインタフェースが、OS/2 や NT などの要求もカバーし、(実行 時に ld -A を使って) 擬似的な動的リンクを許すものとなること が望まれます。 このドキュメントは、新しいプラットホームの DynaLoader をイン プリメントする方のための仕様としてと、アプリケーションで直接 DynaLoader を使いたい方のためのガイドとして提供されるもので す。 DynaLoader 自身は、Perl から C への「グルー」を提供するもの ではありませんから、Perl 以外のライブラリをアクセスするもの としては実用的なものでないことは確かです。 たとえば、C のラ イブラリ関数を呼んだり、引数を与える機能は用意されていません。 将来、開発されるであろうグルーが、個別の動的ロードモジュール としてインプリメントされるものと見込んでいます。 DynaLoader インタフェースの要約 @dl_library_path @dl_resolve_using @dl_require_symbols $dl_debug インプリメント言語: bootstrap($modulename) Perl @filepaths = dl_findfile(@names) Perl Perl module manpages Last change: Release 5.0 Patchlevel 00 1 DYNALOADER(3) USER COMMANDS DYNALOADER(3) $libref = dl_load_file($filename) C $symref = dl_find_symbol($libref, $symbol) C @symbols = dl_undef_symbols() C dl_install_xsub($name, $symref [, $filename]) C $message = dl_error C @dl_library_path dl_findfile() がライブラリなどを検索する標準/デフォルト のディレクトリのリストです。 $dl_library_path[0]、[1]、 ... の順にディレクトリが検索されます。 @dl_library_path は、Configure ($Config{'libpth'}) で決 定される「通常の」ディレクトリ (/usr/lib など) のリスト が初期値となります。 これは、多くのプラットホームの間で の可搬性を保つようにしておくべきです。 @dl_library_path はまた、(SunOS の LD_LIBRARY_PATH のよ うな) 実行時の環境変数から決まるディレクトリも初期値とし て取り込むべきです。 初期化の後は、@dl_library_path は、dl_findfile() を呼ぶ 前に、アプリケーション側で push や unshift を使って操作 できます。 検索時間を短縮したり、「通常の」ディレクトリ にあるものと同じ名前のライブラリをオーバライドしたりする ため、検索順序が前の方になるように、ディレクトリを付け加 えるために unshift を使うことができます。 dl_load_file() が呼び出すロード関数は、絶対パスを必要と するかもしません。 dl_findfile() 関数と @dl_library_path は、ロードしたいライブラリ/オブジェクトを探すために使う ことができ、その絶対パスを返します。 @dl_resolve_using 後に load_file() の呼び出しで生成される可能性のある、未 定義シンボルを解決するために使うことができる追加のライブ ラリや他の共有オブジェクトのリストです。 これは、依存ライブラリを自動的に扱うことのできない、いく つかのプラットホームでのみ必要となるものです。 たとえば、 Perl の拡張ライブラリ Socket (auto/Socket/Socket.so) に は、ロードされたときに解決する必要のある多くのソケット関 数へのリファレンスが含まれます。 多くのプラットホームで は、「依存する」ライブラリ (たとえば、/usr/lib/libsocket.so) がどこにあるかが自動的にわかるようになっています。 ごく 少数のプラットホームで、依存するライブラリの位置を明示す る必要があるのです。 そのために、@dl_resolve_using を使 ってください。 使用例: @dl_resolve_using = dl_findfile('-lsocket'); Perl module manpages Last change: Release 5.0 Patchlevel 00 2 DYNALOADER(3) USER COMMANDS DYNALOADER(3) @dl_require_symbols 動的ロードされるライブラリ/オブジェクトファイル内のシン ボル名のリストです。 いくつかの特定のプラットホームでの み必要となります。 dl_error() 構文: $message = dl_error(); 最後に DynaLoader 関数が出したエラーの、メッセージ内容で す。 UNIX の errno と同じく、エラーの後にうまく行った関 数があっても、このメッセージをクリアすることはありません。 インプリメンテーションの方では、他の関数でエラーが起こっ たら、できる限り早期に検出し、あとで参照できるように、対 応するメッセージを保存するようにしなくてはなりません。 これは、(SunOS のような) いくつかのプラットホームで、エ ラーメッセージが瞬時に無くなってしまう問題を避けることに なります (たとえば、dlerror())。 $dl_debug $dl_debug を真に設定すると、内部のデバッグメッセージが、 有効になります。 現在、$dl_debug の設定は、DynaLoader の Perl 側にだけ影響を与えます。 これらのメッセージは、 アプリケーションの開発者が、DynaLoader の使用上の問題を 解決する手助けするものでなければなりません。 $ENV{'PERL_DL_DEBUG'} が定義されていれば、$dl_debug はこ れによって設定されます。 -DDEBUGGING フラグを付けて Perl を構築したときには、 DynaLoader の開発者/移植者には、同様のデバッグ変数が、C のコードに追加され (dlutils.c を参照)、有効となります。 これも、PERL_DL_DEBUG 環境変数によって設定されます。 1 で最低限の情報が得られ、大きくすることにより情報が増えま す。 dl_findfile() 構文: @filepaths = dl_findfile(@names) ロード可能なファイルの一般的なファイル名前と、場合によっ ては、ディレクトリも与えて、(サフィクスを含む) フルパス 名を決定します。 デフォルトでは、@dl_library_path のデ ィレクトリを検索し、ファイルが見つからなかった場合には、 空リストを返します。 名前は、さまざまな、プラットホームに依存しない形式で指定 することができます。 -lname という形式の名前は、.* をそ のプラットホームのための適切なサフィクスとして、libname.* Perl module manpages Last change: Release 5.0 Patchlevel 00 3 DYNALOADER(3) USER COMMANDS DYNALOADER(3) に変換されます。 名前に、適切なプリフィクスやサフィクスが付いていないとき には、プラットホームに合わせて、プリフィクスやサフィクス を組み合わせを試しながら、対応するファイルを探します: "$name.o"、"lib$name.*"、"$name" @name にディレクトリが含まれる場合には、@dl_library_path の前にそちらで検索を行ないます。 ディレクトリは、-Ldir という形で示すことができます。 その他の形式の名前は、フ ァイル名として検索されます。 -Ldir と -lname という形式の引数を使うことを推奨します。 例: @dl_resolve_using = dl_findfile(qw(-L/usr/5lib -lposix)); dl_expandspec() 構文: $filepath = dl_expandspec($spec) VMS のような、変わったシステムでは、ファイルのシンボル名 を扱うために特別なファイル名が必要になります (VMS の論理 名です)。 こういったシステムをサポートするために、dl_expandspec() 関数は、dl_*.xs 内か、DynaLoader.pm 内の自動ロード可能な dl_expandspec() 関数として追加されるコードとしてインプリ メントすることができます。 詳しくは、DynaLoader.pm を参 照してください。 dl_load_file() 構文: $libref = dl_load_file($filename) $filename を動的にロードします。 $filename は、共有オブ ジェクトかライブラリのパスでなければなりません。 多少解 りづらい「ライブラリリファレンス」が、ロードされたオブジ ェクトのためのハンドルとして返されます。 エラー時には、 undef が返されます。 (SunOS や HP-UX のように、ロードされたオブジェクトのため のハンドルを用意しているシステムでは、$libref は、そのハ ンドルになります。 その他のシステムでは、$libref は、 $filename か、$filename を含むバッファへのポインタになる のが普通です。 アプリケーション側では、いかなる方法でも $libref を調べることも、変更することもしてはなりません。) Perl module manpages Last change: Release 5.0 Patchlevel 00 4 DYNALOADER(3) USER COMMANDS DYNALOADER(3) これが、実際に作業を行なう関数です。 必要ならば、その時 点の @dl_require_symbols と @dl_resolve_using の値を使う ようにしなければなりません。 SunOS: dlopen($filename) HP-UX: shl_load($filename) Linux: dld_create_reference(@dl_require_symbols); dld_link($filename) NeXT: rld_load($filename, @dl_resolve_using) VMS: lib$find_image_symbol($filename,$dl_require_symbols[0]) dl_find_symbol() 構文: $symref = dl_find_symbol($libref, $symbol) シンボル $symbol のアドレスか、見つからなければ undef を 返します。 ターゲットシステムに、異なる型のシンボルを探 すための独立した関数が存在するときには、dl_find_symbol() は、まず、関数シンボルを検索してから、他の型を探すように しておくべきです。 アドレスを $symref に返す、厳密な方法は、現在定義されて いません。 $symref を dl_install_xsub() に渡すことがで き、内容が通じることだけが要求されています。 SunOS: dlsym($libref, $symbol) HP-UX: shl_findsym($libref, $symbol) Linux: dld_get_func($symbol) and/or dld_get_symbol($symbol) NeXT: rld_lookup("_$symbol") VMS: lib$find_image_symbol($libref,$symbol) dl_undef_symbols() 例: @symbols = dl_undef_symbols() load_file() の後で、未定義のままとなっているシンボル名の リストを返します。 不明なときには、() を返します。 お 使いのプラットホームで、このための機構が用意されていなく ても、心配しないでください。 多くは、必要無いから用意し ていないのです。 dl_install_xsub() 構文: dl_install_xsub($perl_name, $symref [, $filename]) $perl_name で示す名前の新しい Perl の外部サブルーティン を、これをインプリメントする関数へのポインタ $symref を 使って生成します。 これは、単純に newXSUB() を直接呼ぶ Perl module manpages Last change: Release 5.0 Patchlevel 00 5 DYNALOADER(3) USER COMMANDS DYNALOADER(3) だけです。 インストールされた関数へのリファレンスを返し ます。 パラメータ $filename は、die() や caller() やデバッガが 必要なときに、その関数のソースファイルを識別するために Perl が使います。 $filename が定義されていないときには、 "DynaLoader" が使われます。 boostrap() 構文: bootstrap($module) これは、Perl での自動的な動的ロードの通常のエントリポイ ントです。 これは、以下の動作を行ないます: + @INC を検索することにより、auto/$module ディレクトリ の場所を特定します + ロードするファイル名を決定するために dl_findfile() を使います + ("boot_$module") を @dl_require_symbols に設定します + 存在すれば auto/$module/$module.bs を実行します (特 に、現在のプラットホームでモジュールをロードするため に、必要なファイルを @dl_resolve_using に追加するた めに使われます) + そのファイルをロードするために dl_load_file() を呼び ます + dl_undef_symbols() を呼び、未定義のシンボルがあれば、 警告を出します + "boot_$module" のため、dl_find_symbol() を呼びます + それを "${module}::bootstrap" としてインストールする ために dl_install_xsub() を呼びます + モジュールをブートストラップするために &{"${module}::bootstrap"} を呼びます AUTHOR このインタフェースは、(順不同で) Larry Wall, Robert Sanders, Dean Roehrich, Jeff Okamoto, Anno Siegel, Thomas Neumann, Paul Marquess, Charles Bailey 他の方の作業とコメントに基づい ています。 Larry Wall は、エレガントな継承によるブートストラップの機構 Perl module manpages Last change: Release 5.0 Patchlevel 00 6 DYNALOADER(3) USER COMMANDS DYNALOADER(3) を設計し、それを使った最初の Perl 5 動的ローダをインプリメン トしました。 Tim Bunce, 11 August 1994. Perl module manpages Last change: Release 5.0 Patchlevel 00 7