模块 Dynlink

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 string
| Unavailable_primitive of string
| Uninitialized_global of string
type error = private 
| 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
| Cannot_open_dynamic_library of exn
| Library's_module_initializers_failed of exn
| Inconsistent_implementation of string
| Module_already_loaded of string
| Private_library_cannot_implement_interface of string
exception Error of error

动态链接中的错误通过引发带有错误描述的 Error 异常来报告。一个常见的情况是系统上找不到动态库:这是通过 Cannot_open_dynamic_library 报告的(包含的异常可能是特定于平台的)。

val error_message : error -> string

将错误描述转换为可打印的消息。