Модуль 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
|
|
| 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
Преобразовать описание ошибки в удобочитаемое сообщение.
© 1995-2022 INRIA.
https://v2.ocaml.org/releases/4.14/htmlman/libref/Dynlink.html