Warum hat der gcc-Ausgabemaschinencode keine Anweisungen?
Frage
Jedes Mal, wenn ich ein objdump -d mache, sehe ich den asm-Code mit Stapeln von nop-Anweisungen (Anweisungen, die nichts tun)
Nehmen Sie zum Beispiel dasselbe Programm:
#include <stdio.h>
#include <math.h>
int main()
{
printf("Hello World!\n");
printf("cos: %f\n", cos(1));
return 1;
}
Der objdump zum Beispiel hat 2 Nops am Ende des Einstiegspunkts
0000000000400450 <_start>:
400450: 31 ed xor %ebp,%ebp
400452: 49 89 d1 mov %rdx,%r9
400455: 5e pop %rsi
400456: 48 89 e2 mov %rsp,%rdx
400459: 48 83 e4 f0 and $0xfffffffffffffff0,%rsp
40045d: 50 push %rax
40045e: 54 push %rsp
40045f: 49 c7 c0 00 06 40 00 mov $0x400600,%r8
400466: 48 c7 c1 70 05 40 00 mov $0x400570,%rcx
40046d: 48 c7 c7 34 05 40 00 mov $0x400534,%rdi
400474: e8 bf ff ff ff callq 400438 <__libc_start_main@plt>
400479: f4 hlt
40047a: 90 nop
40047b: 90 nop
Und das ist nur eines von vielen Beispielen, aber Sie haben die Idee.Warum wird der C-Code so kompiliert?Vielen Dank im Voraus.
Lösung
Sehr oft werden diese nur zum Auffüllen verwendet, damit nachfolgende Inhalte wieder an einem Wort oder einer Grenze beginnen, da der Zugriff auf beliebigen Code, der nicht an Wortgrenzen ausgerichtet ist, für die CPU viel teurer ist.
Andere Tipps
Die nop
s werden hinzugefügt, um die Ausrichtung der nächsten Funktion an der 4-Byte-Grenze zu erzwingen.(Beachten Sie, dass die Adresse nach dem letzten nop
40047c lautet, was durch 4 teilbar ist.)