Модуль 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-2026 INRIA.
https://ocaml.org/manual/5.5/api/Dynlink.html