LibdlModule

El módulo Libdl en Julia proporciona instalaciones especializadas y de nivel inferior para el enlace dinámico con bibliotecas compartidas. Mientras que Julia admite inherentemente el enlace a bibliotecas compartidas en tiempo de ejecución a través de la intrínseca ccall, Libdl amplía esta capacidad al ofrecer un control adicional y más granular. Permite a los usuarios buscar bibliotecas compartidas tanto en memoria como en el sistema de archivos, cargarlas manualmente con opciones específicas del enlazador en tiempo de ejecución y buscar símbolos de biblioteca como punteros de bajo nivel.

source

Dynamic Linker

Base.Libc.Libdl.dlopenFunction
dlopen(libfile::AbstractString [, flags::Integer]; throw_error:Bool = true)

Carga una biblioteca compartida, devolviendo un identificador opaco.

La extensión dada por la constante dlext (.so, .dll o .dylib) se puede omitir de la cadena libfile, ya que se agrega automáticamente si es necesario. Si libfile no es un nombre de ruta absoluto, entonces se buscan las rutas en el array DL_LOAD_PATH para libfile, seguido de la ruta de carga del sistema.

El argumento opcional de flags es un OR a nivel de bits de cero o más de RTLD_LOCAL, RTLD_GLOBAL, RTLD_LAZY, RTLD_NOW, RTLD_NODELETE, RTLD_NOLOAD, RTLD_DEEPBIND y RTLD_FIRST. Estos se convierten en los flags correspondientes del comando dlopen de POSIX (y/o GNU libc y/o MacOS), si es posible, o se ignoran si la funcionalidad especificada no está disponible en la plataforma actual. Los flags predeterminados son específicos de la plataforma. En MacOS, los flags predeterminados de dlopen son RTLD_LAZY|RTLD_DEEPBIND|RTLD_GLOBAL, mientras que en otras plataformas los predeterminados son RTLD_LAZY|RTLD_DEEPBIND|RTLD_LOCAL. Un uso importante de estos flags es especificar un comportamiento no predeterminado para cuando el cargador de bibliotecas dinámicas vincula referencias de bibliotecas a símbolos exportados y si las referencias vinculadas se colocan en el ámbito local del proceso o en el ámbito global. Por ejemplo, RTLD_LAZY|RTLD_DEEPBIND|RTLD_GLOBAL permite que los símbolos de la biblioteca estén disponibles para su uso en otras bibliotecas compartidas, abordando situaciones donde hay dependencias entre bibliotecas compartidas.

Si no se puede encontrar la biblioteca, este método lanza un error, a menos que el argumento de palabra clave throw_error esté configurado en false, en cuyo caso este método devuelve nothing.

Note

A partir de Julia 1.6, este método reemplaza las rutas que comienzan con @executable_path/ con la ruta al ejecutable de Julia, permitiendo cargas de rutas relativas reubicables. En Julia 1.5 y versiones anteriores, esto solo funcionaba en macOS.

source
Base.Libc.Libdl.dlopen_eFunction
dlopen_e(libfile::AbstractString [, flags::Integer])

Similar a dlopen, excepto que devuelve C_NULL en lugar de generar errores. Este método ahora está en desuso a favor de dlopen(libfile::AbstractString [, flags::Integer]; throw_error=false).

source
Base.Libc.Libdl.RTLD_NOWConstant
RTLD_DEEPBIND
RTLD_FIRST
RTLD_GLOBAL
RTLD_LAZY
RTLD_LOCAL
RTLD_NODELETE
RTLD_NOLOAD
RTLD_NOW

Constante de enumeración para dlopen. Consulte la página del manual de su plataforma para obtener detalles, si corresponde.

source
Base.Libc.Libdl.dlsymFunction
dlsym(handle, sym; throw_error::Bool = true)

Busca un símbolo de un manejador de biblioteca compartida, devuelve un puntero a función callable en caso de éxito.

Si no se puede encontrar el símbolo, este método lanza un error, a menos que el argumento clave throw_error esté configurado en false, en cuyo caso este método devuelve nothing.

source
Base.Libc.Libdl.dlsym_eFunction
dlsym_e(handle, sym)

Busca un símbolo de un manejador de biblioteca compartida, devuelve silenciosamente C_NULL en caso de fallo en la búsqueda. Este método ahora está en desuso a favor de dlsym(handle, sym; throw_error=false).

source
Base.Libc.Libdl.dlcloseFunction
dlclose(handle)

Cierra la biblioteca compartida referenciada por el handle.

source
dlclose(::Nothing)

Para el patrón de uso muy común de

try
    hdl = dlopen(library_name)
    ... do something
finally
    dlclose(hdl)
end

Definimos un método dlclose() que acepta un parámetro de tipo Nothing, para que el código del usuario no tenga que cambiar su comportamiento en el caso de que library_name no se encontrara.

source
Base.Libc.Libdl.dlextConstant
dlext

Extensión de archivo para bibliotecas dinámicas (por ejemplo, dll, dylib, so) en la plataforma actual.

source
Base.Libc.Libdl.dllistFunction
dllist()

Devuelve las rutas de las bibliotecas dinámicas actualmente cargadas en un Vector{String}.

source
Base.Libc.Libdl.dlpathFunction
dlpath(handle::Ptr{Cvoid})

Dada una biblioteca handle de dlopen, devuelve la ruta completa.

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

Obtiene la ruta completa de la biblioteca libname.

Ejemplos

julia> dlpath("libjulia")
source
Base.Libc.Libdl.find_libraryFunction
find_library(nombres [, ubicaciones])

Busca la primera biblioteca en nombres en las rutas de la lista ubicaciones, DL_LOAD_PATH o rutas de bibliotecas del sistema (en ese orden) que se pueda abrir con éxito mediante dlopen. En caso de éxito, el valor de retorno será uno de los nombres (potencialmente precedido por una de las rutas en ubicaciones). Esta cadena se puede asignar a un global const y usarse como el nombre de la biblioteca en futuros ccall. En caso de fallo, devuelve la cadena vacía.

source
Base.DL_LOAD_PATHConstant
DL_LOAD_PATH

Al llamar a dlopen, las rutas en esta lista se buscarán primero, en orden, antes de buscar en las ubicaciones del sistema un controlador de biblioteca válido.

source