模組 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

將錯誤描述轉換為可列印的訊息。