题
每次我做一个objdump-d,我总是看到个体和小型代码与批nop指令(指令,做什么)
例如采取这样的程序:
#include <stdio.h>
#include <math.h>
int main()
{
printf("Hello World!\n");
printf("cos: %f\n", cos(1));
return 1;
}
该objdump为exampe有2nops在结束的进入点
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
这只是众多例子,但你的想法。为什么是C编译的代码这样?在此先感谢。
解决方案
很多情况下,这些代码通常只是用于填充,因此后续的工作又会从字或边界开始,因为对cpu而言,访问未在字边界上对齐的任意代码要昂贵得多。
其他提示
的 nop
s是加强下一个功能齐的4个字节的边界。(请注意,地址如下去 nop
将40047c这是可分割的,由4)
不隶属于 StackOverflow