【发布时间】:2011-12-16 06:46:14
【问题描述】:
我使用 C 语言已经有一段时间了,最近才开始接触 ASM。当我编译一个程序时:
int main(void)
{
int a = 0;
a += 1;
return 0;
}
objdump 反汇编有代码,但在 ret 之后没有:
...
08048394 <main>:
8048394: 55 push %ebp
8048395: 89 e5 mov %esp,%ebp
8048397: 83 ec 10 sub $0x10,%esp
804839a: c7 45 fc 00 00 00 00 movl $0x0,-0x4(%ebp)
80483a1: 83 45 fc 01 addl $0x1,-0x4(%ebp)
80483a5: b8 00 00 00 00 mov $0x0,%eax
80483aa: c9 leave
80483ab: c3 ret
80483ac: 90 nop
80483ad: 90 nop
80483ae: 90 nop
80483af: 90 nop
...
据我所知 nops 什么都不做,因为在 ret 之后甚至不会被执行。
我的问题是:为什么要打扰? ELF(linux-x86) 不能与任何大小的 .text 部分(+main) 一起使用吗?
我很感激任何帮助,只是想学习。
【问题讨论】:
-
那些 NOP 会继续吗?如果它们停在
80483af,那么可能是填充将下一个函数对齐到 8 或 16 个字节。 -
no 在 4 个 nops 之后,它进入一个函数:__libc_csu_fini
-
如果 NOP 是由 gcc 插入的,那么我认为它不会只使用 0x90,因为有很多 NOP 的大小变量来自 1-9 bytes(如果使用 gas syntax,则为 10)
标签: c assembly gcc memory-alignment