Question

Everytime I do an objdump -d I always see the asm code with batches of nop instructions (instructions that do nothing)

For example take this same program:

#include <stdio.h>
#include <math.h>

int main()
{
    printf("Hello World!\n");
    printf("cos:  %f\n", cos(1));
    return 1;
}

The objdump for exampe has 2 nops at the end of the entry point

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 

And that is just one of many examples but you get the idea. Why is the C code compiled this way? Thanks in Advance.

Was it helpful?

Solution

Very often those are just used to do padding so that subsequent stuff starts on a word or boundary again, as access to arbitrary code that is not aligned on word boundaries is much more expensive for the cpu.

OTHER TIPS

The nops are added to force the next function align to the 4-byte boundary. (notice that the address following the last nop will be 40047c which is divisible by 4)

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top