【发布时间】:2016-06-01 20:37:15
【问题描述】:
我编写了一个简单的 c 程序,并试图使用 GDB 来调试程序。我了解在主要功能中使用以下内容:
进入时
push %ebp
mov %esp,%ebp
退出时
leave
ret
然后我在 _start 上尝试了 gdb,得到了以下结果
xor %ebp,%ebp
pop %esi
mov %esp,%ecx
and $0xfffffff0,%esp
push %eax
push %esp
push %edx
push $0x80484d0
push $0x8048470
push %ecx
push %esi
push $0x8048414
call 0x8048328 <__libc_start_main@plt>
hlt
nop
nop
nop
nop
我无法理解这些台词,以及这背后的逻辑。
有人可以提供任何指导来帮助解释_start的代码吗?
【问题讨论】:
-
当使用 GCC 进行编译和链接时,
_start是 C 运行时提供的用于初始化的标签。 C 启动初始化完成后,它会调用标签main。也许您打算打破标签main而不是_start?您看到的代码似乎是 C 运行时初始化代码,最终调用main -
初始化代码不遵循典型的调用约定,并且还根据 Linux ABI 处理在命令行上传递的参数,并将它们传递给
main。它还确保堆栈正确对齐。 -
这里有一个非常好的
_start教程:_startis, oddly enough, where we start -
@Michael Petch - 感谢您提供这份令人兴奋的文件。我一定会经历的
-
实际上,我不能相信。另一个迈克尔 - @MichaelBurr 发布了它;-)
标签: linux gcc assembly x86 glibc