2010-04-22 6 views
13

Zum Beispiel zurückkehrend:eine gemeinsam benutzte Bibliothek Symboltabelle

void* sdl_library = dlopen("libSDL.so", RTLD_LAZY); 
void* initializer = dlsym(sdl_library,"SDL_Init"); 

keine Fehler Unter der Annahme, werden Initialisierer auf die Funktion SD_Init in der gemeinsam genutzten Bibliothek libSDK.so zeigen.

Dazu muss jedoch das Symbol "SDL_Init" vorhanden sein.

Ist es möglich, eine Bibliothek nach all ihren Symbolen abzufragen? In diesem Fall würde es beispielsweise SDL_Init, den Funktionszeiger und alle anderen von libSDL.so exportierten Symbole zurückgeben.

Antwort

14

Es gibt keine libc-Funktion, das zu tun. Sie können jedoch selbst eine schreiben (obwohl der Code etwas beteiligt ist).

Unter Linux dlopen() in der Tat gibt die Adresse eines link_map Struktur, die ein Mitglied benannt hat l_addr, die auf die Basisadresse des geladenen gemeinsamen Objekt verweist (vorausgesetzt, Ihr System nicht Bibliothek Platzierung geteilt RANDOMIZE, und dass Ihre Bibliothek wurde nicht verlinkt).

Unter Linux ist eine sichere Methode, die Basisadresse (die Adresse 10) zu finden, dl_iterate_phdr() nach dlopen() in der Bibliothek zu verwenden.

die ELF-Header zu haben, sollten Sie in der Lage sein, eine Liste der exportierten Symbole iterieren (die dynamische Symboltabelle), indem Sie zuerst die Elf*_Phdr vom Typ Ortung PT_DYNAMIC und dann Lokalisieren DT_SYMTAB, DT_STRTAB Einträge und alle Symbole iterieren in der dynamischen Symboltabelle. Verwenden Sie /usr/include/elf.h, um Sie zu führen.

Zusätzlich könnten Sie libelf verwenden, aber ich kann Sie nicht führen, da ich keine vorherige Erfahrung damit habe.

Schließlich ist die Übung etwas zwecklos: Sie erhalten eine Liste definierter Funktionen, aber Sie werden keine Ahnung haben, wie Sie sie nennen sollen (welche Parameter erwarten sie). Worum geht es also?

-2
void *dlsym(void *restrict handle, const char *restrict name); 

Rückgabewert

Wenn Griff nicht durch dlopen(), oder wenn das genannt Symbol wird nicht innerhalb gefundenen geöffnet zu einem gültigen Objekt bezieht jede Die mit verbundenen Handle, dlsym() sollen zurückgegeben werden NULL. Detailliertere Diagnoseinformationen sollen über dlerror() verfügbar sein.

(Quelle: http://www.opengroup.org/onlinepubs/009695399/functions/dlsym.html)

Mit anderen Worten, wenn das Symbol nicht gefunden wird, wird dlsym()NULL zurück. Nicht sicher, ob du das suchst, aber das ist der einfachste Weg, den ich finden kann.

+1

Es klingt für mich wie das OP eine Liste der exportierten Symbole aus der Bibliothek zu erhalten sucht. Was ich nicht für möglich halte, ohne einige Abschnitte in der ELF-Struktur zu analysieren. –

-2

Der Linux nm Befehl verwendet werden könnte: http://man.yolinux.com/cgi-bin/man2html?cgi_command=nm

+0

Die Frage scheint nach einer programmatischen Abfrage der Symboltabelle einer gemeinsam genutzten Bibliothek zu suchen. 'nm' ist ein Befehlszeilendienstprogramm, dessen Textausgabeformat je nach Plattform variiert. –

Verwandte Themen