LibdlModule

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

source

Dynamic Linker

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

Note

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.

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

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

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

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

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

Schließt die durch den Handle referenzierte Shared Library.

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

source
Base.Libc.Libdl.dlextConstant
dlext

Dateiendung für dynamische Bibliotheken (z. B. dll, dylib, so) auf der aktuellen Plattform.

source
Base.Libc.Libdl.dllistFunction
dllist()

Gibt die Pfade der derzeit geladenen dynamischen Bibliotheken in einem Vector{String} zurück.

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

Gibt den vollständigen Pfad einer Bibliothek handle von dlopen zurück.

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

Holen Sie den vollständigen Pfad der Bibliothek libname.

Beispiele

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

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

source