Syntax
#include <dlfcn.h> |
int dladdr(void *address, struct Dl_info *dlip); |
Für den Aufruf in einer ASCII-Umgebung müssen Sie die Funktion __dladdr_ascii() mit denselben Parametern verwenden.
Beschreibung
dladdr() ermittelt, ob sich die angegebene Adresse in einem der zugeordneten Objekte befindet, die den Adressraum der derzeit aktiven Anwendungen bilden. Eine Adresse gilt als innerhalb eines zugeordneten Objekts, wenn sie sich zwischen der Basisadresse und der Endadresse des Objekts befindet. Erfüllt ein zugeordnetes Objekt diese Bedingung, dann wird die dem dynamischen Binder zur Verfügung gestellte Symboltabelle nach dem „nächstgelegenen“ Symbol durchsucht, d.h dem Symbol, dessen Wert mit der erforderlichen Adresse übereinstimmt bzw. möglichst knapp darunter liegt.
Die Struktur Dl_info muss zuvor vom Benutzer zugeordnet werden. Die einzelnen Elemente der Struktur werden auf Grund der angegebenen Adresse mit Hilfe von dladdr() versorgt.
Die Struktur Dl_info enthält folgende Elemente:
const char * dli_fname; void * dli_fbase; const char * dli_sname; void * dli_saddr;
Bedeutung dieser Elemente:
dli_fname
enthält einen Zeiger, der auf den Dateinamen des enthaltenden Objekts verweist.
dli_fbase
enthält die Basisadresse des enthaltenden Objekts.
dli_sname
enthält einen Zeiger, der auf den Namen des nächstgelegenen Symbols verweist. Dessen Wert stimmt mit der angegebenen Adresse übereinstimmt bzw. liegt möglichst knapp darunter.
dli_saddr
enthält die tatsächliche Adresse des Symbols.
Returnwert
Wenn die angegebene Adresse keinem zugeordneten Objekt zugeordnet werden kann, wird der Wert 0 zurückgegeben. Andernfalls wird ein anderer Wert zurückgegeben und die zugeordneten Dl_info-Elemente werden versorgt.
Die Variable errno wird nicht gesetzt. Ein Fehlertext (Diagnoseinfo) kann über dlerror() ermittelt werden.
Hinweis
Die Dl_info-Zeigerelemente verweisen auf Adressen innerhalb der zugeordneten Objekte. Diese Adressen können ungültig werden, wenn die entsprechenden Objekte entfernt werden (siehe dlclose()). Wenn kein Symbol zum Beschreiben der angegebenen Adresse gefunden wird, werden die beiden Elemente dli_sname und dli_saddr auf den Wert 0 gesetzt.
Das Element dli_fbase der Struktur Dl_info wird nicht gesetzt und hat stets den Wert 0.
Beispiel
Der Einfachheit halber sind die Fehlerabfragen weggelassen.
void *handle; int symboladdr; int ret; struct Dl_info obj_info; /* Oeffnen der Bibliothek */ handle = dlopen("mydynlib.so", RTLD_NOW | RTLD_GLOBAL); /* Ermitteln Adresse zum Entry symbolname */ symboladdr = dlsym(handle, "symbolname"); /* welches Symbol ist 8KB hinter symboladdr zu finden? */ symboladdr += 8192; if((ret = dladdr((void *)symboladdr, (struct Dl_info *) &obj_info)) == 0) { /* Fehler */ printf("dladdr() schlug fehl fuer Adresse %08X\n", symboladdr); fprintf("dlerror(): %s\n", dlerror()); } else { /* erfolgreich */ printf("dladdr:\n \tdli_fname %s\n \tdli_fbase %08X\n \tdli_sname %s\n \tdli_saddr %08X\n", obj_info.dli_fname, (int)obj_info.dli_fbase, obj_info.dli_sname, (int)obj_info.dli_saddr ); }
Siehe auch
dlclose(), dlerror(), dlopen()