2017-10-22 7 views
0

Ich schreibe einen Userland Elf Loader als Nebenprojekt, um mehr über ELF-Dateien und ihre Funktionsweise zu erfahren. Ich frage mich, wo ich die Adresse zum Laden eines Symbols aus einer dynamischen Bibliothek (libc.so.6) bekommen kann. Wenn ich das Programm zerlegen erhalte ich:Woher kommt die Adresse eines dynamischen Symbols?

$objdump -d test | grep puts 
    400420:  ff 25 f2 0b 20 00  jmpq *0x200bf2(%rip)  # 601018 <[email protected]_2.2.5> 

0x200bf2 die Adresse, wo die Funktion geht, aber wo bekomme ich es?

EDIT: Ich bitte um, wo es nicht geladen wird, wo es definiert ist, so ist st_value irrelevant

Antwort

0

Sie haben manuell die Elf zu analysieren.

eine Liste aller der Symbole (Programmeinstiegspunkte, Adressen von Variablen, etc.), die definiert

Dieses enthält oder:

Diese Art von Informationen kann in einem Symboltabelle Abschnitt finden referenziert innerhalb der Datei die dem Symbol zugeordnete Adresse und irgendeine Art von Markierung, die den Typ des Symbols angibt.

(Von The Linux Journal)

die Symboltabelle zu finden, über die Abschnitte durchlaufen, bis Sie für die sh_type = SHT_SYMTAB einen Abschnitt finden, dann ist es angemessen zu analysieren.

Die Symboltabelle ist ein Array von Elf32_Sym und/oder Elf64_Sym Strukturen. Die Adresse der Methode wird st_value Mitglied der Struktur zugewiesen, die relativ zu der Abschnittsüberschrift bei Index st_shndx ist.

Für weitere Informationen können Sie sich beziehen:

+0

Welche Eintrag auf der Symboltabelle enthält die Adresse? –

+0

@ ZachS, die Symboltabelle ist ein Array von 'Elf32_Sym' und/oder' Elf64_Sym' Strukturen. Die Adresse der Methode wird dem Member 'st_value' der Struktur zugewiesen. Eine Verknüpfung zum Symboltabellenformat als Referenz hinzugefügt. –

+0

Es ist in der Datei nicht definiert, da es ein dynamisches Symbol ist, ich habe den st_value für wo es definiert ist (in libc.so.6) Ich frage mich, wie ich die Adresse bekommen kann, wo sie geladen wird. st_value für dynamische/undefinierte Symbole ist Null, was falsch ist –