module Dynlink:sig
..end
动态加载 .cmo、.cma 和 .cmxs 文件。
val is_native : bool
true
如果程序是原生代码,false
如果程序是字节码。
val loadfile : string -> unit
在字节码中:加载给定的字节码对象文件(.cmo
文件)或字节码库文件(.cma
文件),并将其链接到正在运行的程序。在原生代码中:加载给定的 OCaml 插件文件(通常为 .cmxs
),并将其链接到正在运行的程序。
加载的编译单元中的所有顶层表达式都会被求值。没有提供访问单元定义的值名称的工具。因此,单元本身必须通过修改函数表等方式将它的入口点注册到主程序(或先前加载的库)中。
如果给定的库定义的顶层模块的名称与主程序或先前使用 loadfile
加载的共享库中存在的模块名称冲突,则会引发异常。先前使用 loadfile_private
加载的共享库中的模块不受此限制。
此函数加载的编译单元将添加到“允许的单元”列表中(参见 Dynlink.set_allowed_units
)。
val loadfile_private : string -> unit
与 loadfile
相同,但刚刚加载的编译单元对以后动态加载的其他模块是隐藏的(无法引用)。
如果给定的库定义的顶层模块的名称与主程序或先前使用 loadfile
加载的共享库中存在的模块名称冲突,则会引发异常。先前使用 loadfile_private
加载的共享库中的模块不受此限制。
如果给定的库定义的顶层模块的名称与主程序或先前使用 loadfile
加载的共享库中存在的某个模块所依赖的接口的名称匹配,则也会引发异常。即使此依赖关系只是“模块别名”依赖关系(即仅依赖于名称而不是接口的内容),也会发生这种情况。
此函数加载的编译单元不会添加到“允许的单元”列表中(参见 Dynlink.set_allowed_units
),因为它们无法从其他编译单元中引用。
val adapt_filename : string -> string
在字节码中,是恒等函数。在原生代码中,将最后一个扩展名替换为 .cmxs
。
val set_allowed_units : string list -> unit
设置将来动态加载的单元可以引用的编译单元列表,使其完全等于给定的值。
最初,构成当前正在运行的程序的所有编译单元都可以被动态链接的单元引用。 set_allowed_units
可用于限制对这些单元的子集的访问,例如,限制对构成动态链接代码的 API 的单元的访问,并阻止对所有其他单元(例如,正在运行的程序的私有内部模块)的访问。
请注意,Dynlink.loadfile
会更改允许的单元列表。
val allow_only : string list -> unit
allow_only units
将允许的单元列表设置为现有允许单元与给定单元列表的交集。因此,它永远不会增加允许的单元集。
val prohibit : string list -> unit
prohibit units
通过从允许的单元列表中删除这些单元,禁止动态链接的单元引用列表 units
中命名的单元。这可以用来阻止对选定单元(例如,正在运行的程序的私有内部模块)的访问。
val main_program_units : unit -> string list
返回构成主程序的编译单元列表(即,不是动态链接的)。
val public_dynamically_loaded_units : unit -> string list
返回通过 loadfile
(而不是通过 loadfile_private
)动态加载的编译单元列表。请注意,动态加载的编译单元无法卸载。
val all_units : unit -> string list
返回构成主程序的编译单元列表以及通过 loadfile
(而不是通过 loadfile_private
)动态加载的编译单元列表。
val allow_unsafe_modules : bool -> unit
控制是否允许动态链接不安全的对象文件。如果编译单元包含外部函数的声明,则该编译单元是不安全的,这可能会破坏类型安全性。默认情况下,不允许动态链接不安全的对象文件。在原生代码中,此函数不执行任何操作;始终允许动态链接包含外部函数的对象文件。
type
linking_error = private
| |
Undefined_global of |
| |
of |
| |
Uninitialized_global of |
type
error = private
| |
Not_a_bytecode_file of |
| |
Inconsistent_import of |
| |
of |
| |
Unsafe_file |
| |
Linking_error of |
| |
Corrupted_interface of |
| |
Cannot_open_dynamic_library of |
| |
Library's_module_initializers_failed of |
| |
Inconsistent_implementation of |
| |
Module_already_loaded of |
| |
Private_library_cannot_implement_interface of |
exception Error of error
动态链接中的错误通过引发带有错误描述的 Error
异常来报告。一个常见的情况是系统上找不到动态库:这是通过 Cannot_open_dynamic_library
报告的(包含的异常可能是特定于平台的)。
val error_message : error -> string
将错误描述转换为可打印的消息。