Ruft Programmnamen in einer gemeinsam genutzten Bibliothek programmatisch ab

9

Kann ich eine Liste aller Funktionsnamen aus einer gemeinsam genutzten Bibliothek (nur Linux) programmgesteuert erhalten, wenn ich dl_open() ?

verwende?

Ich möchte so etwas:

%Vor%

Beispielbibliothek (mylib.so)

Kopfzeile (.h):

%Vor%

Quelle (.c):

%Vor%

Dirty hack, den ich kenne: benutze nm oder objdump utility

    
Alex Bar 12.08.2014, 17:16
quelle

1 Antwort

2

Dafür gibt es keine libc-Funktion. Sie können jedoch selbst einen Code schreiben (oder den Code aus einem Tool wie Readelf kopieren oder einfügen).

Unter Linux gibt dlopen() die Adresse einer link_map -Struktur zurück, die ein Mitglied mit dem Namen l_addr hat, das auf die Basisadresse des geladenen freigegebenen Objekts zeigt (vorausgesetzt, dass das System die Platzierung der freigegebenen Bibliothek nicht zufällig vornimmt), und dass Ihre Bibliothek nicht verlinkt wurde).

Unter Linux können Sie die Basisadresse (die Adresse von Elf*_Ehdr ) finden, indem Sie dl_iterate_phdr() nach dlopen() in der Bibliothek verwenden.

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

Zusätzlich könntest du Libelf verwenden, das ich persönlich nicht sehr gut kenne.

Beachten Sie jedoch, dass Sie eine Liste definierter Funktionen erhalten, aber Sie werden nicht wissen, wie Sie sie aufrufen sollen.

    
Colin Pitrat 20.02.2016, 11:16
quelle

Tags und Links