Libdl
— ModuleLe module Libdl en Julia fournit des installations spécialisées et de bas niveau pour le lien dynamique avec des bibliothèques partagées. Bien que Julia prenne en charge de manière inhérente le lien vers des bibliothèques partagées à l'exécution via l'intrinsèque ccall
, Libdl
étend cette capacité en offrant un contrôle supplémentaire et plus granulaire. Il permet aux utilisateurs de rechercher des bibliothèques partagées à la fois en mémoire et dans le système de fichiers, de les charger manuellement avec des options de lien dynamique spécifiques, et de rechercher des symboles de bibliothèque sous forme de pointeurs de bas niveau.
Dynamic Linker
Base.Libc.Libdl.dlopen
— Functiondlopen(libfile::AbstractString [, flags::Integer]; throw_error:Bool = true)
Charge une bibliothèque partagée, renvoyant un handle opaque.
L'extension donnée par la constante dlext
(.so
, .dll
ou .dylib
) peut être omise de la chaîne libfile
, car elle est automatiquement ajoutée si nécessaire. Si libfile
n'est pas un nom de chemin absolu, alors les chemins dans le tableau DL_LOAD_PATH
sont recherchés pour libfile
, suivis du chemin de chargement système.
L'argument facultatif flags est un ou exclusif de zéro ou plusieurs de RTLD_LOCAL
, RTLD_GLOBAL
, RTLD_LAZY
, RTLD_NOW
, RTLD_NODELETE
, RTLD_NOLOAD
, RTLD_DEEPBIND
et RTLD_FIRST
. Ceux-ci sont convertis en les drapeaux correspondants de la commande dlopen POSIX (et/ou GNU libc et/ou MacOS), si possible, ou sont ignorés si la fonctionnalité spécifiée n'est pas disponible sur la plateforme actuelle. Les drapeaux par défaut sont spécifiques à la plateforme. Sur MacOS, les drapeaux par défaut de dlopen
sont RTLD_LAZY|RTLD_DEEPBIND|RTLD_GLOBAL
, tandis que sur d'autres plateformes, les valeurs par défaut sont RTLD_LAZY|RTLD_DEEPBIND|RTLD_LOCAL
. Une utilisation importante de ces drapeaux est de spécifier un comportement non par défaut pour lorsque le chargeur de bibliothèque dynamique lie des références de bibliothèque à des symboles exportés et si les références liées sont mises dans un scope local au processus ou global. Par exemple, RTLD_LAZY|RTLD_DEEPBIND|RTLD_GLOBAL
permet aux symboles de la bibliothèque d'être disponibles pour une utilisation dans d'autres bibliothèques partagées, abordant des situations où il y a des dépendances entre les bibliothèques partagées.
Si la bibliothèque ne peut pas être trouvée, cette méthode lance une erreur, sauf si l'argument clé throw_error
est défini sur false
, auquel cas cette méthode renvoie nothing
.
À partir de Julia 1.6, cette méthode remplace les chemins commençant par @executable_path/
par le chemin vers l'exécutable Julia, permettant des chargements de chemins relatifs relocalisables. Dans Julia 1.5 et antérieur, cela ne fonctionnait que sur macOS.
Base.Libc.Libdl.dlopen_e
— Functiondlopen_e(libfile::AbstractString [, flags::Integer])
Semblable à dlopen
, sauf qu'il retourne C_NULL
au lieu de lever des erreurs. Cette méthode est maintenant obsolète au profit 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 d'énumération pour dlopen
. Consultez la page de manuel de votre plateforme pour plus de détails, le cas échéant.
Base.Libc.Libdl.dlsym
— Functiondlsym(handle, sym; throw_error::Bool = true)
Recherchez un symbole à partir d'un handle de bibliothèque partagée, renvoyez un pointeur de fonction appelable en cas de succès.
Si le symbole ne peut pas être trouvé, cette méthode lève une erreur, sauf si l'argument clé throw_error
est défini sur false
, auquel cas cette méthode renvoie nothing
.
Base.Libc.Libdl.dlsym_e
— Functiondlsym_e(handle, sym)
Recherchez un symbole à partir d'un handle de bibliothèque partagée, renvoyez silencieusement C_NULL
en cas d'échec de la recherche. Cette méthode est désormais obsolète au profit de dlsym(handle, sym; throw_error=false)
.
Base.Libc.Libdl.dlclose
— Functiondlclose(handle)
Ferme la bibliothèque partagée référencée par le handle.
dlclose(::Nothing)
Pour le modèle d'utilisation très courant de
try
hdl = dlopen(library_name)
... faire quelque chose
finally
dlclose(hdl)
end
Nous définissons une méthode dlclose()
qui accepte un paramètre de type Nothing
, afin que le code utilisateur n'ait pas à changer son comportement dans le cas où library_name
n'a pas été trouvé.
Base.Libc.Libdl.dlext
— Constantdlext
Extension de fichier pour les bibliothèques dynamiques (par exemple, dll, dylib, so) sur la plateforme actuelle.
Base.Libc.Libdl.dllist
— Functiondllist()
Renvoie les chemins des bibliothèques dynamiques actuellement chargées dans un Vector{String}
.
Base.Libc.Libdl.dlpath
— Functiondlpath(handle::Ptr{Cvoid})
Étant donné une bibliothèque handle
provenant de dlopen
, renvoie le chemin complet.
dlpath(libname::Union{AbstractString, Symbol})
Obtenez le chemin complet de la bibliothèque libname
.
Exemples
julia> dlpath("libjulia")
Base.Libc.Libdl.find_library
— Functionfind_library(noms [, emplacements])
Recherche la première bibliothèque dans noms
dans les chemins de la liste emplacements
, DL_LOAD_PATH
ou les chemins de bibliothèque système (dans cet ordre) qui peut être dlopen'd avec succès. En cas de succès, la valeur de retour sera l'un des noms (potentiellement préfixé par l'un des chemins dans emplacements). Cette chaîne peut être assignée à un global const
et utilisée comme nom de bibliothèque dans les futurs ccall
. En cas d'échec, elle retourne la chaîne vide.
Base.DL_LOAD_PATH
— ConstantDL_LOAD_PATH
Lors de l'appel de dlopen
, les chemins de cette liste seront recherchés en premier, dans l'ordre, avant de rechercher dans les emplacements système un handle de bibliothèque valide.