Linux dlopen System in C

Linux dlopen System in C
Die Bibliotheksfunktion dlopen () ist eine sehr nützliche Funktion in der C -Sprache. Die Funktion lädt die Bibliothek nach dem Öffnen eines neuen in den Speicher in den Speicher. Wir verwenden es im Allgemeinen, um die Bibliotheksymbole zu laden, die zur Kompilierungszeit unbekannt sind. Dlopen () ist eine Funktion, die in unseren Programmen verwendet wird. Die DL -Bibliothek implementiert DLOPen (), definiert in DLFCN.H. Für die DLOPEN -Funktion sind zwei Parameter erforderlich: den Namen der Bibliotheksdatei und das Flag. Der Name der Datei ist eine dynamische Bibliothek und definiert, ob die Abhängigkeiten der Bibliothek sofort berechnet werden oder nicht. Der dlopen () gibt einen „Handle“ zurück, der als undurchsichtiger Wert angesehen werden sollte, und andere DL -Bibliotheksvorgänge verwenden dies. Wenn der Versuch, zu laden. Aber der Dlopen () gibt denselben Dateihandle zurück, wenn es die gleiche Bibliothek mehrfach lädt.

Während der Verwendung der DLOPEN -Funktion untersucht der Compiler keine potenziellen Fehler, da er die Typen und Prototypen, die wir verwenden, nicht bekannt ist. Die Bereitstellung der DLOPEN -Funktion für die Standardbelastung scheint nicht von ihr zu fördern, mit Ausnahme einiger kleiner Situationen. Übrigens ist es ein Ansatz zur Verbesserung der Selbstbeobachtung. Wenn das gemeinsame Modul derzeit von einem anderen Programm genutzt wird, ist die Speicherlayout -Optimierung nicht besonders an bedingten Belastungen interessiert. Der Speicher Fußabdruck erhöht sich nicht, wenn eine zuvor gebrauchte Bibliothek geladen wird. Das Vermeiden der Compiler -Überwachung ist gefährlich und sorgt für ein gutes Schreiben von Fehlern. Zusätzlich fehlt uns die mögliche Compiler -Optimierung.

Beispiel 1:

Betrachten Sie nun das folgende Beispiel, um die Funktionalität der DLOPEN -Funktion in der C -Sprache anzuzeigen. Im ersten Schritt laden wir einige C -Standardbibliotheken. Hier laden wir die neue Bibliothek "DLFCN.H ”, mit dem die Makros definiert werden.

Dann stellen wir eine andere Bibliothek in unser Programm „GNU/lib-name ein.H". Die mit GNU LIBC enthaltenen freigegebenen Bibliotheksdateien werden von den Benutzerprogrammen gemäß den von ihnen definierten Makros gefunden. Die GNU C-Bibliothek bietet die grundlegenden Bibliotheken für die Betriebssysteme GNU und GNU/Linux sowie eine breite Palette anderer Linux-basierter Systeme an. Danach haben wir die wichtigste Methode -Implementierung. In diesem Bereich deklarieren wir das Zeigerobjekt „Handle“ mit dem void -Schlüsselwort. Wir deklarieren eine Zeiger -Sinusfunktion mit dem Datentyp -Doppel. Es gibt eine weitere Erklärung des Zeigerobjekts „Fehler“ für die Fehlerbehandlung.

Danach rufen wir die DLOPEN -Funktion im Objekt „Handle“ auf. Der Dlopen nimmt zwei Argumente ein: libm_so und "rtld_lazy". Hier ist „libm_so“ der Name der Bibliotheksdatei, die mathematische Funktionen wie trigonometrische Funktionen liefert. Diese gemeinsame Bibliothek ist erforderlich, da wir die Sinusfunktion verwenden. Das "rtld_lazy" ist ein weiteres Argument, das die DLOPEN -Funktion aufruft. Wenn auf ein bestimmtes Symbol auf das erste Mal verwiesen wird, müssen die Umzüge zu einem Zeitpunkt durchgeführt werden, der durch die Implementierung bestimmt wird.

Da ein Prozess nicht jedes Symbol in einer ausführbaren Objektdatei verweist, sollte die Angabe des RTLD Lazy die Leistung bei Implementierungen verbessern, die die dynamische Symbolbindung ermöglichen. Als Nächst. Wir rufen den Dlerror an, um den Fehler zu löschen.

Die Funktion dlerror () liefert eine von der Null-terminierte Zeichenfolge, die menschlich lesbar ist und die Berichterstattung über den jüngsten Fehler angibt. Dann werfen wir die Funktion wie folgt auf: "(*void **) (& Sinus) = dlsym (Handle, Sünde)". Da dies seltsam ist, entspricht Casting ISO C, was Warnungen vor dem Compiler vermeidet. Wir verwenden die DLSym -Funktion, die den Pfad eines Symbols erhält, das in einem dynamischen Verbindungsmodul angegeben ist, auf das über eine DLOPEN () -Funktion zugegriffen werden kann.

Außerdem führen wir die IF-ELSE-Operation erneut für den Standardfehler aus, der erzeugt wird, wenn der Dlerror () nicht null ist. Anschließend haben wir eine Printf -Anweisung, in der wir den Sinuswert angeben, der berechnet wird. Im letzten Schritt schließen wir dieses gemeinsame Objekt, indem wir die DLCLOSE für den vom DLOPEN zurückgegebenen Griff aufrufen ().

#enthalten
#enthalten
#enthalten
#enthalten
int
Main (int argc, char ** argv)

void *Handle;
double (*Sinus) (doppelt);
char *fehler;
handle = dlopen (libm_so, rtld_lazy);
Wenn (!handhaben)
fprintf (stderr, "%s \ n", dlerror ());
exit (exit_failure);

dlerror ();
*(void **) (& Sinus) = dlsym (Handle, "sin");
if ((error = dlerror ()) != Null)
fprintf (stderr, "%s \ n", error);
exit (exit_failure);

printf ("%f \ n", (*Sinus) (4.0));
dlclose (Handle);
exit (exit_success);

Wir verwenden die Option -ldl mit dem Befehl c compilation, da dies die Bibliothek für die DLOPEN -verknüpfte Schnittstelle ist und dies erforderlich ist. Wenn die Ausführung der DLOPEN-Datei erstellt wird, wird der Sinuswert des zuvor gegebenen Wertes angezeigt.

Beispiel 2:

Jetzt nehmen wir ein weiteres Beispiel für die Verwendung der DLOPEN -Funktion. Wir laden unser Programm mit allen erforderlichen C -Bibliotheken für die Implementierung des DLOPEN -Code. Dann starten wir unser Programm innerhalb der Hauptmethode. Hier definieren wir die Zeichenfolge mit der Deklaration der Variablen „SRC“. Wir deklarieren dann die Zeigervariablen "Strlen", "Handle" und "Fehler".

Als Nächst. Die DLOPEN -Funktion gibt die gemeinsam genutzte Bibliothek „libstr.Also ”für die Funktionsabwicklungsfunktionen und das Flag„ rtld_lazy “, das bereits im vorherigen Beispiel demonstriert ist. Wir rufen die Dlerror -Funktion in der Variablen „Fehler“ auf, um den von der DLOPEN -Funktion generierten Fehler zu löschen. Die IF-ELSE wird verwendet, um die Fehler zu untersuchen.

Anschließend erhalten wir die Adresse der Strlen -Funktion mithilfe der DLSym -Funktion und überprüfen die Fehler dabei. Danach verwenden wir die Printf -Funktion, um die STRNlen -Funktion aufzurufen, um die Länge der angegebenen Zeichenfolge zurückzugeben. Am Ende schließen wir die gemeinsame Bibliothek mit der DLCLOSE -Funktion.

#enthalten
#enthalten
#enthalten
#enthalten
int main (void)

char* src = "Hallo Linux";
int ( *strlen) (const char *);
void *Handle;
char *fehler;
Handle = dlopen ("./libstr.Also ", rtld_lazy);
Fehler = dlerror ();
Wenn(!Handle || Fehler != Null) printf ("Ladebibliotheksversuch fehlgeschlagen!\ n%s \ n ", Fehler);
return -1;
Strlen = dlsym (Griff, "Strlen");
Fehler = dlerror ();
Wenn(!Strlen || error == null) printf ("%s \ n", error); return -1;
printf ("Die Länge der Zeichenfolge ist:%d \ n", Strlen (SRC));
dlclose (Handle);
Rückkehr 0;

Wir verwenden den folgenden Befehl für die Ausführung des angegebenen Programms. Hier wird das -lSTR -Flag für die Funktion der Zeichenfolge Länge verwendet und die LDL wird für die DLOPEN -Bibliotheksdatei verwendet. Das kompilierte Programm gibt die Länge der Zeichenfolge an, wie in der Shell gezeigt:

Abschluss

Die Informationen werden in Bezug auf die DLOPEN -Funktion der C -Sprache in diesem Artikel bereitgestellt. Wir haben eine kurze Einführung der DLOPEN -Funktion. Dann haben wir zwei Beispiele implementiert. Die Funktion gibt eine Kennung zurück, die die geöffnete Bibliothek definiert. Die Adressen der Funktionen in der geöffneten Bibliothek werden dann unter Verwendung dieser Kennung und der DLSym -Funktion bestimmt. Die Adresse einer Funktion in einer Bibliothek, die bereits mit DLOPEN geöffnet wurde.