给定以下 C 函数:
void go(char *data) {
char name[64];
strcpy(name, data);
}
x86-64 上的 GCC 5 和 6 编译(gcc -c -g -o
后跟objdump
) 到:
0000000000000000 <go>:
0: 55 push %rbp
1: 48 89 e5 mov %rsp,%rbp
4: 48 83 ec 50 sub $0x50,%rsp
8: 48 89 7d b8 mov %rdi,-0x48(%rbp)
c: 48 8b 55 b8 mov -0x48(%rbp),%rdx
10: 48 8d 45 c0 lea -0x40(%rbp),%rax
14: 48 89 d6 mov %rdx,%rsi
17: 48 89 c7 mov %rax,%rdi
1a: e8 00 00 00 00 callq 1f <go+0x1f>
1f: 90 nop
20: c9 leaveq
21: c3 retq
GCC 是否有任何理由插入90
/ nop
at1f
或者这只是在未打开优化时可能发生的副作用?
注意:这个问题与大多数其他问题不同,因为它询问nop
的是函数体内部,而不是外部填充。
测试的编译器版本:GCC Debian 5.3.1-14 (5.3.1) 和 Debian 6-20160313-1 (6.0.0)