Libdl
— ModuleEl 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.
Dynamic Linker
Base.Libc.Libdl.dlopen
— Functiondlopen(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
.
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.
Base.Libc.Libdl.dlopen_e
— Functiondlopen_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)
.
Base.Libc.Libdl.RTLD_NOW
— ConstantRTLD_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.
Base.Libc.Libdl.dlsym
— Functiondlsym(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
.
Base.Libc.Libdl.dlsym_e
— Functiondlsym_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)
.
Base.Libc.Libdl.dlclose
— Functiondlclose(handle)
Cierra la biblioteca compartida referenciada por el handle.
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.
Base.Libc.Libdl.dlext
— Constantdlext
Extensión de archivo para bibliotecas dinámicas (por ejemplo, dll, dylib, so) en la plataforma actual.
Base.Libc.Libdl.dllist
— Functiondllist()
Devuelve las rutas de las bibliotecas dinámicas actualmente cargadas en un Vector{String}
.
Base.Libc.Libdl.dlpath
— Functiondlpath(handle::Ptr{Cvoid})
Dada una biblioteca handle
de dlopen
, devuelve la ruta completa.
dlpath(libname::Union{AbstractString, Symbol})
Obtiene la ruta completa de la biblioteca libname
.
Ejemplos
julia> dlpath("libjulia")
Base.Libc.Libdl.find_library
— Functionfind_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.
Base.DL_LOAD_PATH
— ConstantDL_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.