Everytime I do an objdump -d I always see the asm code with batches of nop instructions (instructions that do nothing)
每次我做一个objdump -d我总是看到asm代码与批量的nop指令(指令什么都不做)
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
示例的objdump在入口点的末尾有2个nops
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.
这只是众多例子中的一个,但你明白了。为什么C代码以这种方式编译?提前致谢。
2 个解决方案
#1
7
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.
通常这些只是用来做填充,以便后续的东西再次在一个字或边界上开始,因为访问未在字边界上对齐的任意代码对于cpu而言要昂贵得多。
#2
17
The nop
s 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)
添加nops以强制下一个函数与4字节边界对齐。 (注意最后一个nop后面的地址是40047c,可被4整除)
#1
7
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.
通常这些只是用来做填充,以便后续的东西再次在一个字或边界上开始,因为访问未在字边界上对齐的任意代码对于cpu而言要昂贵得多。
#2
17
The nop
s 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)
添加nops以强制下一个函数与4字节边界对齐。 (注意最后一个nop后面的地址是40047c,可被4整除)