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.

War es hilfreich?

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 nops 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.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top