Libdl
— ModuleDas Libdl-Modul in Julia bietet spezialisierte und niedrigere Funktionen für das dynamische Verlinken mit gemeinsam genutzten Bibliotheken. Während Julia von Natur aus das Verlinken mit zur Laufzeit gemeinsam genutzten Bibliotheken über die ccall
-Intrinsik unterstützt, erweitert Libdl
diese Fähigkeit, indem es zusätzliche, detailliertere Kontrollen bietet. Es ermöglicht Benutzern, nach gemeinsam genutzten Bibliotheken sowohl im Speicher als auch im Dateisystem zu suchen, sie manuell mit spezifischen Optionen des Laufzeit-Linkers zu laden und Bibliothekssymbole als niedrigstufige Zeiger nachzuschlagen.
Dynamic Linker
Base.Libc.Libdl.dlopen
— Functiondlopen(libfile::AbstractString [, flags::Integer]; throw_error:Bool = true)
Lädt eine Shared Library und gibt einen undurchsichtigen Handle zurück.
Die durch die Konstante dlext
angegebene Erweiterung (.so
, .dll
oder .dylib
) kann aus dem libfile
-String weggelassen werden, da sie bei Bedarf automatisch angehängt wird. Wenn libfile
kein absoluter Pfadname ist, werden die Pfade im Array DL_LOAD_PATH
nach libfile
durchsucht, gefolgt vom Systemladepfad.
Das optionale Argument flags ist eine bitweise Oder-Verknüpfung von null oder mehr der Werte RTLD_LOCAL
, RTLD_GLOBAL
, RTLD_LAZY
, RTLD_NOW
, RTLD_NODELETE
, RTLD_NOLOAD
, RTLD_DEEPBIND
und RTLD_FIRST
. Diese werden, wenn möglich, in die entsprechenden Flags des POSIX (und/oder GNU libc und/oder MacOS) dlopen-Befehls umgewandelt oder ignoriert, wenn die angegebene Funktionalität auf der aktuellen Plattform nicht verfügbar ist. Die Standardflags sind plattformspezifisch. Auf MacOS sind die Standard-dlopen
-Flags RTLD_LAZY|RTLD_DEEPBIND|RTLD_GLOBAL
, während sie auf anderen Plattformen RTLD_LAZY|RTLD_DEEPBIND|RTLD_LOCAL
sind. Eine wichtige Verwendung dieser Flags besteht darin, ein nicht standardmäßiges Verhalten anzugeben, wenn der dynamische Bibliothekslader Bibliotheksreferenzen an exportierte Symbole bindet und ob die gebundenen Referenzen in den lokalen oder globalen Prozessbereich gelegt werden. Zum Beispiel ermöglicht RTLD_LAZY|RTLD_DEEPBIND|RTLD_GLOBAL
, dass die Symbole der Bibliothek für die Verwendung in anderen Shared Libraries verfügbar sind, was Situationen adressiert, in denen Abhängigkeiten zwischen Shared Libraries bestehen.
Wenn die Bibliothek nicht gefunden werden kann, wirft diese Methode einen Fehler, es sei denn, das Schlüsselwortargument throw_error
ist auf false
gesetzt, in diesem Fall gibt diese Methode nothing
zurück.
Ab Julia 1.6 ersetzt diese Methode Pfade, die mit @executable_path/
beginnen, durch den Pfad zur Julia-Ausführungsdatei, was relocatable relative-path loads ermöglicht. In Julia 1.5 und früher funktionierte dies nur auf macOS.
Base.Libc.Libdl.dlopen_e
— Functiondlopen_e(libfile::AbstractString [, flags::Integer])
Ähnlich wie dlopen
, gibt jedoch C_NULL
zurück, anstatt Fehler auszulösen. Diese Methode ist jetzt veraltet zugunsten von 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
Enum-Konstante für dlopen
. Siehe das Handbuch Ihrer Plattform für Details, falls zutreffend.
Base.Libc.Libdl.dlsym
— Functiondlsym(handle, sym; throw_error::Bool = true)
Sucht ein Symbol aus einem Shared-Library-Handle und gibt einen aufrufbaren Funktionszeiger im Erfolgsfall zurück.
Wenn das Symbol nicht gefunden werden kann, wirft diese Methode einen Fehler, es sei denn, das Schlüsselwortargument throw_error
ist auf false
gesetzt, in diesem Fall gibt diese Methode nothing
zurück.
Base.Libc.Libdl.dlsym_e
— Functiondlsym_e(handle, sym)
Sucht ein Symbol aus einem Shared-Library-Handle und gibt bei einem Lookup-Fehler stillschweigend C_NULL
zurück. Diese Methode ist jetzt veraltet zugunsten von dlsym(handle, sym; throw_error=false)
.
Base.Libc.Libdl.dlclose
— Functiondlclose(handle)
Schließt die durch den Handle referenzierte Shared Library.
dlclose(::Nothing)
Für das sehr häufige Nutzungsmuster von
try
hdl = dlopen(library_name)
... do something
finally
dlclose(hdl)
end
definieren wir eine dlclose()
-Methode, die einen Parameter vom Typ Nothing
akzeptiert, damit der Benutzercode sein Verhalten nicht ändern muss, falls library_name
nicht gefunden wurde.
Base.Libc.Libdl.dlext
— Constantdlext
Dateiendung für dynamische Bibliotheken (z. B. dll, dylib, so) auf der aktuellen Plattform.
Base.Libc.Libdl.dllist
— Functiondllist()
Gibt die Pfade der derzeit geladenen dynamischen Bibliotheken in einem Vector{String}
zurück.
Base.Libc.Libdl.dlpath
— Functiondlpath(handle::Ptr{Cvoid})
Gibt den vollständigen Pfad einer Bibliothek handle
von dlopen
zurück.
dlpath(libname::Union{AbstractString, Symbol})
Holen Sie den vollständigen Pfad der Bibliothek libname
.
Beispiele
julia> dlpath("libjulia")
Base.Libc.Libdl.find_library
— Functionfind_library(names [, locations])
Durchsucht die erste Bibliothek in names
in den Pfaden der locations
-Liste, DL_LOAD_PATH
oder Systembibliothekspfaden (in dieser Reihenfolge), die erfolgreich mit dlopen'd werden kann. Bei Erfolg ist der Rückgabewert einer der Namen (möglicherweise mit einem der Pfade in locations vorangestellt). Dieser String kann einer global const
zugewiesen und als Bibliotheksname in zukünftigen ccall
-Aufrufen verwendet werden. Bei Misserfolg wird der leere String zurückgegeben.
Base.DL_LOAD_PATH
— ConstantDL_LOAD_PATH
Beim Aufrufen von dlopen
werden die Pfade in dieser Liste zuerst in der angegebenen Reihenfolge durchsucht, bevor die Systemstandorte nach einem gültigen Bibliotheks-Handle durchsucht werden.