load

ReferenceTOPKeywords

コマンド名

load - マシンコードをロードし、新しいコマンドを初期化します。

構文

load fileName
load fileName packageName
load fileName packageName interp

解説

本コマンドはバイナリコードをファイルからアプリケーションのアドレススペースにロードし、インタプリタに取り込むためにパッケージ内の初期化プロシージャを呼び出します。 fileName はコードが含まれるファイル名です。その厳密なフォーマットはシステムによって様々ですが、ほとんどのシステムおいてSolaris環境の.soファイルやWindows環境のDLLのような共有ライブラリです。 packageName はパッケージ名であり、初期化プロシージャの名前を導出するために使われます。 interp はパッケージをロードするインタプリタのパス名です(詳細は interpのマニュアルを参照)。interp が省略される場合、load コマンドが呼び出されたインタプリタがデフォルトとなります。

ファイルがいったんアプリケーションのアドレススペースにロードされると2つの初期化プロシージャのうちの1つが新しいコードで呼び出されます。 一般的に初期化プロシージャはTclのインタプリタに新しいコマンドを付け加えます。 初期化プロシージャの名前はpackageNameとターゲットインタプリタが安全なものであるかどうかで決まます。普通 のインタプリタでは初期 化プロシージャはpkg_Initという形式を持ちます。pkgpackageNameの最初の文字を大文字にし、他の文字をすべて小文字にしたものです。 例えば、packageNamefooFOoだとすると、初期化プロシージャの名前はFoo_Initとなります。

ターゲットインタプリタが安全なインタプリタなら初期化プロシージャの名前は pkg_Initのかわりにpkg_SafeInitとなります。 pkg_SafeInit関数は慎重に書かれなければなりません。信用されないコードを使うためにパッケージで提供される安全で部分的な機能のみインタプ リタを初期化します。 Safe-Tclに関する詳細情報は safe マニュアルを参照してください。

初期化プロシージャは以下のプロトタイプにマッチしなければなりません。

typedef int Tcl_PackageInitProc(Tcl_Interp *interp);

interp引数はパッケージがロードされるインタプリタを示します。初期化プロシージャは完了したかどうかを示すためにTCL_OKTCL_ERRORのいずれかを返します。エラーの場合はインタープリタの結果 をエラーメッセージを示すものに設定されます。loadコマンドの結果は初期化プロシージャによって返された結果 です。

アプリケーションで各fileNameにつき、実際のファイルのロードはただ1度行われます。与えられたfileName が複数のインタプリタにロードされる場合、最初のloadはコードをロードし、初期化プロシージャを呼び出します。 後続のloadは再びコードをロードせず、初期化プロシージャを呼び出すだけです。パッケージをアンロードやリロードすることは不可能です。

また、load コマンドはアプリケーションに静的にリンクされたパッケージもサポー トします。 これらのパッケージが Tcl_StaticPackageプロシージャの呼び出しにより登録されていることは条件です。 fileName が空文字列の場合、packageNameは必ず指定しなければなりません。

packageNameが省略されるか空文字列に指定される場合、Tclはパッケージの名前を推測します。これは異なるプラットホームで異なった方法で行われます。ほとんどのUNIXプラットホームに使われるデフォルト推測は、fileNameの最後の要素をとり、最初の3文字がlibならそれを取除き、後続する残ったアルファベットと下線の文字をモジュールの名前として使用します。例えば、load libxyz4.2.so コマンドはモジュール名 xyzを使用し、 load bin/last.so {} コマンドはモジュール名lastを使用します。

fileNameが空文字列ならば、packageNameは必ず指定しなければなりません。 loadコマンドは最初にこの名前で静的にロードされたパッケージを検索します(Tcl_StaticPackageプロシージャの呼出しにより登 録されている)。見つかればそれが使われます。見つからなければ、loadコマンドはその名前で動的にロードされたパッケージを検索します。見つかればそれが使われます。同じパッケージの異なるバージョンのファイルがロードされていた場合、 Tcl は先にロードされたファイルを選びます。

移植性の問題

Windows
ロードが”library not found”エラーで失敗でするとき、依存するライブラリが発見されなかった可能性もあります。依存のライブラリを確認するには、DOSコンソールにおいて"dumpbin -imports <dllname>"を入力し、何のライブラリをimportすべきかを確認したほうがよいでしょう。現在のディレクトリにDLLをロードするとき、Windows はパス記述子として"./"を無視して、その代りに独自の検索を使ってDLLを見つけようとします。これを避けるために、DLLをロードするには、
load [file join [pwd] mylib.DLL]
        を使います。

バグ

同じファイルが異なるfileNamesでロードされる場合、プロセスのアドレススペースに何回もロードされてしまいます。この処理はシステムにより異なります(いくつかのシステムは余分なロードを検知できますが、しないものもあります)。

参照

info sharedlibextension, Tcl_StaticPackage, safe

キーワード

binary code, loading, safe interpreter, shared library


Copyright © 1995-1996 Sun Microsystems, Inc. Copyright © 1995-1997 Roger E. Critchlow Jr.