Ich habe eine kurze Zeit mit C gearbeitet und vor kurzem angefangen, mich mit ASM zu beschäftigen. Wenn ich ein Programm kompiliere:
int main(void)
{
int a = 0;
a += 1;
return 0;
}
Die objdump-Demontage hat den Code, aber nops nach dem ret:
...
08048394 <main>:
8048394: 55 push %ebp
8048395: 89 e5 mov %esp,%ebp
8048397: 83 ec 10 sub $0x10,%esp
804839a: c7 45 fc 00 00 00 00 movl $0x0,-0x4(%ebp)
80483a1: 83 45 fc 01 addl $0x1,-0x4(%ebp)
80483a5: b8 00 00 00 00 mov $0x0,%eax
80483aa: c9 leave
80483ab: c3 ret
80483ac: 90 nop
80483ad: 90 nop
80483ae: 90 nop
80483af: 90 nop
...
Nach dem, was ich gelernt habe, tun Nops nichts, und da nach Ret würde nicht einmal ausgeführt werden.
Meine Frage ist: Warum sich die Mühe machen? Konnte ELF (Linux-x86) nicht mit einem Textabschnitt (+ main) beliebiger Größe arbeiten?
Ich würde mich über jede Hilfe freuen, nur um zu lernen.
80483af
, ist es vielleicht ein Auffüllen, um die nächste Funktion auf 8 oder 16 Bytes auszurichten.