LibdlModule

Le 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.

source

Dynamic Linker

Base.Libc.Libdl.dlopenFunction
dlopen(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.

Note

À 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.

source
Base.Libc.Libdl.dlopen_eFunction
dlopen_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).

source
Base.Libc.Libdl.RTLD_NOWConstant
RTLD_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.

source
Base.Libc.Libdl.dlsymFunction
dlsym(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.

source
Base.Libc.Libdl.dlsym_eFunction
dlsym_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).

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

Ferme la bibliothèque partagée référencée par le handle.

source
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é.

source
Base.Libc.Libdl.dlextConstant
dlext

Extension de fichier pour les bibliothèques dynamiques (par exemple, dll, dylib, so) sur la plateforme actuelle.

source
Base.Libc.Libdl.dllistFunction
dllist()

Renvoie les chemins des bibliothèques dynamiques actuellement chargées dans un Vector{String}.

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

Étant donné une bibliothèque handle provenant de dlopen, renvoie le chemin complet.

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

Obtenez le chemin complet de la bibliothèque libname.

Exemples

julia> dlpath("libjulia")
source
Base.Libc.Libdl.find_libraryFunction
find_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.

source
Base.DL_LOAD_PATHConstant
DL_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.

source