Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

dlopen - Zugriff auf eine Shared Object Datei ermöglichen

&pagelevel(3)&pagelevel

Syntax


#include <dlfcn.h>
void *dlopen(const char *file, int mode);


Für den Aufruf in einer ASCII-Umgebung müssen Sie die Funktion __dlopen_ascii() mit denselben Parametern verwenden.

Beschreibung

dlopen() ermöglicht es dem aufrufenden Programm, auf eine über file angegebene Shared Object Datei zuzugreifen.

dlopen() gibt ein Handle zurück, welches das aufrufende Programm für anschließende dlsym()- und dlclose()-Aufrufe verwenden kann. Der Wert dieses Handle darf vom aufrufenden Programm nicht interpretiert werden.

Mit Hilfe von file wird der Pfadname für die Objektdatei wie folgt generiert:

  • Wenn file mit einem Schrägstrich beginnt, dann wird das Argument von file als vollständiger Dateiname interpretiert.
  • Beginnt file nicht mit einem Schrägstrich, dann wird die Variable LD_LIBRARY_PATH benutzt, um zusammen mit file den vollständigen Dateinamen zu erzeugen.
    LD_LIBRARY_PATH enthält eine Liste von Verzeichnissen (absolute oder auch relative Pfadnamen), die durch Doppelpunkt getrennt sind. Wenn diese Liste leer ist, wird das aktuelle Arbeitsverzeichnis verwendet.
  • Wenn file den Wert 0 hat, dann liefert dlopen() ein Handle für ein globales Symbolobjekt. Dieses Objekt ermöglicht den Zugriff auf die Symbole aus der Menge der globalen Objekte des Programms. Diese Menge besteht aus der ursprünglichen Imagedatei des Programms, allen beim Programmstart geladenen Objekten sowie die Menge der Objekte, die bei einem dlopen()-Aufruf mit Flag RTLD_GLOBAL geladen wurden. Da sich die zuletzt genannte Menge von Objekten während der Ausführung ändern kann, kann sich auch die über das Handle identifizierte Objektmenge dynamisch ändern.

Der Parameter mode beschreibt, wie dlopen() die Adressauflösung und die Sichtbarkeit von Symbolen in Bezug auf file behandelt. Wenn ein Objekt in den Adressraum eines Prozesses verschoben wird, dann kann es Verweise auf Symbole enthalten, deren Adressen vor dem Laden des Objekts nicht bekannt sind. Solche Verweise müssen aufgelöst werden, damit auf die Symbole zugegriffen werden kann. Über den Parameter mode wird gesteuert, wann diese Adressauflösungen stattfinden. mode kann folgende Werte annehmen:

RTLD_LAZY

Gleiches Verhalten wie bei RTLD_NOW.

RTLD_NOW

Alle notwendigen Adressauflösungen werden beim ersten Laden eines Objekts durchgeführt. Jedes Shared Object wird zusammen mit den zugehörigen abhängigen Objekten in einem eigenen Binde-Lade-Kontext geladen. Bleiben Externverweise offen, so wird keine Warnung ausgegeben; dlopen() beendet sich nicht mit Fehler.

Jedes über dlopen() geladene Objekt, dessen Verweise auf globale Symbole aufgelöst werden müssen, kann auf die Symbole in der Imagedatei des ursprünglichen Prozesses, auf alle beim Programmstart geladenen Objekte (d. h. auf sich selbst sowie auf alle im selben Aufruf von dlopen() enthaltenen Objekte), und auf alle über einen dlopen()-Aufruf mit Flag RTLD_GLOBAL geladenen Objekte verweisen.

Die Sichtbarkeit für die über einen dlopen()-Aufruf geladenen Symbole kann über folgende Werte von mode festgelegt werden (bitweise „Oder“-Verknüpfung):

RTLD_GLOBAL

Die Symbole des Objekts stehen für die Adressauflösung von anderen Objekten zur Verfügung.

Damit können Objekte, die mit dieser mode-Einstellung geladen wurden, über Symbole gesucht werden, d.h. mit Hilfe von dlopen (0, mode) und zugeordnetem dlsym().

RTLD_LOCAL

Die Symbole des Objekts stehen nicht für die Adressauflösung von anderen Objekten zur Verfügung.

Wenn weder RTLD_GLOBAL noch RTLD_LOCAL angegeben werden, dann wird RTLD_LOCAL als Standardwert genommen.

Außerdem bewirkt die Angabe von RTLD_GLOBAL, dass das Objekt unabhängig von einer früheren oder späteren Angabe von RTLD_LOCAL so lange den Status RTLD_GLOBAL behält, wie es im Adressraum bleibt (siehe dlclose()).

Über dlopen() in ein Programm aufgenommene Symbole können referenziert werden, z.B. für offene Externverweise später geladener Objekte. Bei solchen Symbolen handelt es sich möglicherweise um Duplikate von Symbolen, die bereits vom Programm oder von vorangegangenen dlopen()-Aufrufen definiert wurden.

Die Symbole, die über dlopen()-Aufrufe aufgenommen wurden und mit Hilfe von dlsym() verfügbar sind, sind genau diejenigen, die bei einem VSVI-Aufruf als Typ ENTRY angezeigt werden.

Returnwert

dlopen() gibt NULL zurück, wenn eine der folgenden Bedingungen erfüllt ist:

  • Die in file angegebene Datei kann nicht gefunden werden.
  • Der Lesezugriff auf file ist nicht möglich.
  • Das Objektformat von file eignet sich nicht für die Verarbeitung durch dlopen().
  • Während des Ladens von file oder der Befriedigung der Symbolverweise ist ein Fehler aufgetreten.
  • Es wurden unbefriedigte Externverweise gefunden. Das Shared Object wird in diesem Fall nicht weiterverarbeitet.

Die Variable errno wird nicht gesetzt. Ein Fehlertext (Diagnoseinfo) kann über dlerror() ermittelt werden.


Wenn Entries mehrfach angegeben werden, dann wird dies nicht als Fehler betrachtet (kein NULL-Returnwert). Bei mehrfach angegebenen Entries wird immer der erste Entry verwendet.

Wenn die Umgebungsvariable LD_UNRESOLVED=YES gesetzt ist, dann werden Shared Objects auch dann weiterverarbeitet, wenn ungelöste Externverweise gefunden wurden (kein NULL-Returnwert!).

Das jeweilige sprachspezifische Laufzeitsystem wird vor dem Laden des Shared Object in den Defaultkontext geladen und initialisiert. Das Laufzeitsystem muss hierzu im BS2000 über IMON installiert sein.

Pro ungelöstem Externverweis wird eine Meldung mit dem Namen und dem Type des Externverweises (XDSECT, VCON oder EXTERN) ausgegeben. Dabei werden maximal 512 ungelöste Externverweise berücksichtigt. Sind mehr als diese 512 ungelösten Externverweise vorhanden, so wird zusätzlich ein Warnungshinweis ausgegeben. Durch schrittweise Korrekturen lassen sich damit alle ungelösten Externverweise auffinden und beheben.

Beispiel

Das folgende Beispiel veranschaulicht, wie dlopen() verwendet werden kann.

void    *handle; 

/* Das Objekt oeffnen*/ 
handle = dlopen("./mylib.so",RTLD_LAZY + RTLD_GLOBAL);
if (handle == NULL) {
    printf (error during dlopen, dlerror: %s\n”, dlerror());
    exit(EXIT_FAILURE);
}

Siehe auch

dlclose(), dlerror(), dlsym()