Документация Engee

Модуль Libdl в Julia предоставляет специализированные и низкоуровневые средства для динамической компоновки с общими библиотеками. Хотя в Julia изначально поддерживается компоновка с общими библиотеками времени выполнения через встроенный вызов ccall, модуль Libdl расширяет эту возможность, предлагая дополнительный, более детальный контроль. Он позволяет пользователям искать общие библиотеки как в памяти, так и в файловой системе, вручную загружать их с определенными параметрами компоновщика времени выполнения и искать символы библиотек как низкоуровневые указатели.

Dynamic Linker

dlopen(libfile::AbstractString [, flags::Integer]; throw_error:Bool = true)

Загружает общую библиотеку, возвращая непрозрачный дескриптор.

Расширение, задаваемое константой dlext (.so, .dll или .dylib), можно опускать из строки libfile, так как оно автоматически добавляется при необходимости. Если libfile не является именем абсолютного пути, то по путям в массиве DL_LOAD_PATH выполняется поиск libfile, а затем поиск по путям загрузки системы.

Аргументы необязательных флагов — это побитовое ИЛИ нуля или более флагов RTLD_LOCAL, RTLD_GLOBAL, RTLD_LAZY, RTLD_NOW, RTLD_NODELETE, RTLD_NOLOAD, RTLD_DEEPBIND и RTLD_FIRST. Они преобразуются в соответствующие флаги команды POSIX (и (или) GNU libc и (или) MacOS) Dlopen, если это возможно, или игнорируются, если указанная функциональность недоступна на текущей платформе. Флаги по умолчанию зависят от платформы. В MacOS флаги dlopen по умолчанию — RTLD_LAZY|RTLD_DEEPBIND|RTLD_GLOBAL, а на других платформах флаги по умолчанию — RTLD_LAZY|RTLD_DEEPBIND|RTLD_LOCAL. Важным способом использования этих флагов является указание поведения не по умолчанию, когда средство загрузки динамической библиотеки связывает ссылки на библиотеку с экспортированными символами и если связанные ссылки помещаются в процесс местной или глобальной области. Например, RTLD_LAZY|RTLD_DEEPBIND|RTLD_GLOBAL разрешает символам библиотеки быть доступными для использования в других общих библиотеках, реагируя на ситуации, в которых имеются зависимости между общими библиотеками.

Если библиотеку невозможно найти, этот метод выдает ошибку, кроме тех случаев, когда для именованного аргумента throw_error задано значение false. В этом случае этот метод возвращает nothing.

Начиная с версии Julia 1.6 этот метод заменяет пути, начинающиеся с @executable_path/, путем к исполняемому файлу Julia, что обеспечивает загрузки по относительному пути с возможностью перемещения. В Julia 1.5 и более ранних версиях это работало только в macOS.

dlopen_e(libfile::AbstractString [, flags::Integer])

Аналогично функции dlopen, за исключением того, что возвращается C_NULL, а не выдаются ошибки. Этот метод теперь является устаревшим, вместо него следует использовать dlopen(libfile::AbstractString [, flags::Integer]; throw_error=false).

RTLD_DEEPBIND
RTLD_FIRST
RTLD_GLOBAL
RTLD_LAZY
RTLD_LOCAL
RTLD_NODELETE
RTLD_NOLOAD
RTLD_NOW

Константа перечисления для dlopen. Подробные сведения см. на главной странице для вашей платформы, если применимо.

dlsym(handle, sym; throw_error::Bool = true)

Ищет символ из дескриптора общей библиотеки, возвращая указатель вызываемой функции в случае успеха.

Если символ невозможно найти, этот метод выдает ошибку, кроме тех случаев, когда для именованного аргумента throw_error задано значение false. В этом случае этот метод возвращает nothing.

dlsym_e(handle, sym)

Ищет символ из дескриптора общей библиотеки, автоматически возвращая C_NULL при сбое поиска. Этот метод теперь является устаревшим, вместо него следует использовать dlsym(handle, sym; throw_error=false).

dlclose(handle)

Закрывает общую библиотеку, на которую ссылается дескриптор.


dlclose(::Nothing)

Для очень распространенного шаблона использования:

try
    hdl = dlopen(library_name)
    ... выполняем действия
finally
    dlclose(hdl)
end

мы определяем метод dlclose(), который принимает параметр типа Nothing, чтобы этому пользовательскому коду не нужно было изменять свое поведение в случае, если имя библиотеки (library_name) не было найдено.

dlext

Расширение файла для динамических библиотек (например, dll, dylib, so) на текущей платформе.

dllist()

Возвращает пути динамических библиотек, в настоящий момент загруженных в Vector{String}.

dlpath(handle::Ptr{Cvoid})

Для заданного дескриптора (handle) библиотеки из dlopen возвращает полный путь.


dlpath(libname::Union{AbstractString, Symbol})

Возвращает полный путь библиотеки libname.

Примеры

julia> dlpath("libjulia")
find_library(names [, locations])

Ищет первую библиотеку в именах (names) в путях из списка расположений locations, DL_LOAD_PATH или путях к системным библиотекам (в этом порядке), для которых можно успешно выполнить команду dlopen. При успешном выполнении возвращаемым значением будет одно из имен (к которому можно добавлять в виде префикса один из путей в расположениях). Строку можно присвоить global const и использовать в качестве имени библиотеки в будущих ccall. При сбое возвращает пустую строку.

DL_LOAD_PATH

При вызове dlopen в первую очередь поиск будет выполняться по путям в этом списке по порядку, и лишь затем поиск допустимого дескриптора библиотеки будет вестись в системных расположениях.