Syntax
#include <dlfcn.h> |
void *dlsym(void *handle, const char *name); |
Für den Aufruf in einer ASCII-Umgebung müssen Sie die Funktion __dlsym_ascii() mit denselben Parametern verwenden.
Beschreibung
Mit Hilfe von dlsym() können Prozesse die Adresse eines Symbols ermitteln, das in einem per dlopen()-Aufruf verfügbar gemachten Objekt definiert wurde.
handle bestimmt die Suchstrategie. Für handle sind folgende Angaben möglich:
- Der Wert, der von einem dlopen()-Aufruf zurückgegeben und seitdem nicht über einen dlclose()-Aufruf freigegeben wurde.
- RTLD_DEFAULT
Es werden alle Objekte werden in der zeitlichen Reihenfolge ihres Ladens durchsucht. - RTLD_NEXT
Es werden nur die Objekte durchsucht, die zeitlich nach dem Objekt geladen wurden, aus dem der Aufruf dlsym() abgesetzt wurde. - RTLD_SELF
Zuerst wird das Objekt durchsucht, aus dem de Aufruf dlsym() abgesetzt wurde.
Anschließend werden alle danach geladenen Objekte durchsucht.
name ist der Name des Symbols als Zeichenfolge.
Returnwert
Wenn handle nicht auf ein gültiges Objekt verweist oder wenn das angegebene Symbol in keinem der handle zugeordneten Objekte gefunden werden kann, gibt dlsym() der Wert NULL zurück.
Bei den Namen ist zu beachten, dass Großschreibung und das Ersetzen von ’_’ durch ’$’ beim Übersetzen der Objekte festgelegt werden (durch entsprechende Optionen beim Kommando cc).
Die Variable errno wird nicht gesetzt. Ein Fehlertext (Diagnoseinfo) kann über dlerror() ermittelt werden.
Beispiel
Das folgende Beispiel veranschaulicht, wie dlopen() und dlsym() für den Zugriff auf Funktionen oder Datenobjekte verwendet werden können. Zur Vereinfachung wurde die Überprüfung auf Fehler weggelassen.
void *handle; int *iptr, (*fptr)(int); /* Das benoetigte Objekt oeffnen*/ handle = dlopen("/usr/home/me/libfoo.so.1",RTLD_LAZY); /* Die Adresse von Funktionen und Datenobjekten suchen*/ fptr = (int (*)(int))dlsym(handle, "my_function"); iptr = (int *)dlsym(handle, "my_object"); /* Die Funktion aufrufen und den Wert des Integer als Parameter uebergeben*/ (*fptr)(*iptr);
Siehe auch
dlclose(), dlerror(), dlopen()