Was ist Los in __libc_start_main?
Ich versuche es wirklich zu verstehen, die Schritte von der high-level-code -> ausführbare.. aber ich habe einige Schwierigkeiten.
Ich geschrieben habe, eine leere int main() {}
C-Datei und versuche, das zu entziffern, Demontage über objdump -d
. Hier ist was Los:
- in
_start
, einrichten Ausrichtung, drücken Sie die Argumente auf den stack, call__libc_start_main
- in
__libc_start_main
die erste Zeile ausgeführt wirdjmp *0x8049658
Jedoch bei der Verwendung objdump -R
zu überprüfen, die Verlagerung von Datensätzen, wird der Wert in 0x8049658
ist __libc_start_main
selbst!
Bin ich hier etwas fehlt..
edit: hier ein Teil des Quellcodes;
080482c0 <__libc_start_main@plt>:
80482c0: ff 25 58 96 04 08 jmp *0x8049658
80482c6: 68 08 00 00 00 push $0x8
80482cb: e9 d0 ff ff ff jmp 80482a0 <_init+0x2c>
Disassembly of section .text:
080482d0 <_start>:
80482d0: 31 ed xor %ebp,%ebp
80482d2: 5e pop %esi
80482d3: 89 e1 mov %esp,%ecx
80482d5: 83 e4 f0 and $0xfffffff0,%esp
80482d8: 50 push %eax
80482d9: 54 push %esp
80482da: 52 push %edx
80482db: 68 50 84 04 08 push $0x8048450
80482e0: 68 e0 83 04 08 push $0x80483e0
80482e5: 51 push %ecx
80482e6: 56 push %esi
80482e7: 68 d0 83 04 08 push $0x80483d0
80482ec: e8 cf ff ff ff call 80482c0 <__libc_start_main@plt>
80482f1: f4 hlt
80482f2: 66 90 xchg %ax,%ax
DYNAMIC RELOCATION RECORDS
OFFSET TYPE VALUE
08049644 R_386_GLOB_DAT __gmon_start__
08049654 R_386_JUMP_SLOT __gmon_start__
08049658 R_386_JUMP_SLOT __libc_start_main
- Außerdem können Sie die vollständigen Assembler-code, die Sie verweisen? Es macht unser Leben viel einfacher.
- Was passiert, wenn Sie Schritt für Schritt durch die Montage mit einem debugger? Es ist möglich, dass der dynamische linker überschreibt den Wert an der Speicherstelle 0x8049658, so dass durch die Zeit, die das Programm bekommt, um die
jmp *0x8049658
Anweisung, es springt auch immer Wert habe geschrieben, gibt es zur Laufzeit. - Ich bin mir nicht 100% wie das zu tun. Ich weiß, wie zu setzen, gdb bis zu Schritt durch mein C-code, aber weiß nicht, wie es für die Montage :S
- der gdb wird nicht einmal lassen Sie mich führen Sie das Programm. Ich bekomme
[Inferior 1 (process 24455) exited with code 01]
__libc_start_main@plt
ist nicht das gleiche symbol wie__libc_start_main
- Sie sollten nicht benötigen keine speziellen gdb-setup. Verwenden Sie einfach die gdb-Befehle si und ni führen Sie Ihr Programm eine Anweisung zu einem Zeitpunkt.
- auch keine nur
__libc_start_main
- symbol erscheint in meiner objdump
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den ersten block, mit der Endung "@plt", das procedure linkage table (https://stackoverflow.com/a/5469334/994153). Die
jmp *0x8049658
ist ein Indirekter Sprungbefehl, so dass es tatsächlich ist, springen auf__libc_start_main
wo es eigentlich endet immer geladen im RAM zur Laufzeit.Den realen RAM-Adresse
__libc_start_main
findet sich in der DYNAMISCHEN VERLAGERUNG DATENSÄTZE der Tabelle, die im RAM erstellt, die von der dynamic loader, wenn das Programm geladen wird.lazy loading
für die Suche nach einem Schlüsselwort.