module Dynlink: sig
.. end
オブジェクトファイルの動的読み込み
val is_native : bool
プログラムがネイティブコンパイルされていれば true
、バイトコードであれば false
になります。
コンパイル済みファイルの動的読み込み
val loadfile : string -> unit
バイトコード: 与えられたバイトコードオブジェクトファイル(.cmo
ファイル)またはバイトコードライブラリファイル(.cma
ファイル)を読み込み、実行中のプログラムにリンクします。
ネイティブコード: 与えられた OCaml プラグインファイル(通常 .cmxs
)を読み込み、実行中のプログラムにリンクします。
読み込まれた翻訳単位のトップレベル式がすべて評価されます。
ただし、読み込まれた翻訳単位で定義されている値の名前にアクセスする方法はありません。
読み込まれた側で関数のテーブルを変更するなどしてエントリポイントをメインプログラムに登録しなければなりません。
val loadfile_private : string -> unit
loadfile
と同じですが、読み込まれた翻訳単位が後で動的に読み込まれたモジュールから隠蔽されます(参照できなくなります)。
val adapt_filename : string -> string
バイトコード中では恒等関数になります。ネイティブコード中ではファイル名の拡張子を .cmxs
に置き換えます。
アクセス制御
val allow_only : string list -> unit
allow_only units
は動的リンクされた翻訳単位が参照することのできる範囲を制限し、
units
中に名前のある翻訳単位だけを参照できるようにします。
loadfile
中や
loadfile_private
中に指定された以外の翻訳単位を参照しようとすると
Unavailable_unit
例外が発生します。
初期状態(init
を呼び出した直後)では、現在実行中のプログラムの要素である翻訳単位だけが動的リンクされた翻訳単位から参照できるようになっています。
allow_only
は初期状態で指定されている翻訳単位の一部だけにアクセスできるようにすることにしか使えません。
すなわち、動的リンクされるコードに対する API を構成する翻訳単位にだけアクセスできるようにし、それ以外の実行中のプログラムの内部モジュールにはアクセスできないようにするために使います。
val prohibit : string list -> unit
prohibit units
は動的ロードされる翻訳単位が units
中に名前のある翻訳単位にアクセスすることを禁止します。
この関数は、指定された翻訳単位を実行中のプログラムの内部モジュールとし、外部からアクセスできないようにするために使えます。
val default_available_units : unit -> unit
動的ロードされるコードから参照できる翻訳単位の範囲をデフォルト値、すなわち、現在実行中のプログラムを構成する全翻訳単位に再設定します。
val allow_unsafe_modules : bool -> unit
安全でないオブジェクトファイルを動的リンクできるかどうかを制御します。
ある翻訳単位が型安全性を破るような外部関数を含む場合、その翻訳単位は「安全でない」と言います。
デフォルトでは安全でないオブジェクトファイルの動的リンクは許可されていません。
ネイティブコードではこの関数は何もせず、外部関数を含むオブジェクトファイルの動的リンクは常に許可されています。
非推奨。アクセス制御のための低レベル API
val add_interfaces : string list -> string list -> unit
add_interfaces units path
grants dynamically-linked object
files access to the compilation units named in list units
.
The interfaces (.cmi
files) for these units are searched in
path
(a list of directory names).
val add_available_units : (string * Digest.t) list -> unit
Same as
Dynlink.add_interfaces
, but instead of searching
.cmi
files
to find the unit interfaces, uses the interface digests given
for each unit. This way, the
.cmi
interface files need not be
available at run-time. The digests can be extracted from
.cmi
files using the
extract_crc
program installed in the
Objective Caml standard library directory.
val clear_available_units : unit -> unit
Empty the list of compilation units accessible to dynamically-linked
programs.
非推奨。初期化
val init : unit -> unit
Deprecated.Dynlink
ライブラリを初期化します。
この関数は必要に応じて自動的に呼び出されます。
エラーの通知
type
linking_error =
| |
Undefined_global of string |
| |
Unavailable_primitive of string |
| |
Uninitialized_global of string |
type
error =
| |
Not_a_bytecode_file of string |
| |
Inconsistent_import of string |
| |
Unavailable_unit of string |
| |
Unsafe_file |
| |
Linking_error of string * linking_error |
| |
Corrupted_interface of string |
| |
File_not_found of string |
| |
Cannot_open_dll of string |
| |
Inconsistent_implementation of string |
exception Error of error
動的リンク中のエラーはエラーの説明文字列を引数として Error
例外を発生させることにより報告されます。
val error_message : error -> string
エラーの説明を表示可能な文字列に変換します。