注册 登录
编程论坛 汇编论坛

奇怪的exit函数

vfdff 发布于 2010-11-01 22:20, 966 次点击
程序代码:
#include <stdlib.h>

int main(void)
{
  exit(0);
}
(gdb) disas exit
Dump of assembler code for function exit@plt:
0x0804832c <exit@plt+0>:    jmp    *0x804a008
0x08048332 <exit@plt+6>:    push   $0x10
0x08048337 <exit@plt+11>:    jmp    0x80482fc
End of assembler dump.

一般函数都会在开始部分保存堆栈的,但是这个exit函数去比较特别,竟然没有push之类的指令,是不是因为这个函数不必返回,所以不用保存堆栈了?


3 回复
#2
vfdff2010-11-01 22:44
从分析过程,我们可以得出以下结论。
在Windows下,return 0 的实际执行过程是:

    *
      先析构main函数内的局部对象。
    *
      返回至调用main的函数。
    *
      调用exit函数,由exit函数调用doexit函数,在doexit函数中完成对全局对象的析构。
    *
      最后调用ExitProcess结束进程。

所以,ExitProcess不负责任何对象的析构,exit只负责析构全局对象,return 0可以析构局部对象并调用exit,因此能析构全部对象。
#3
wisji82010-11-26 20:17
还没能力懂。
#4
vfdff2011-01-09 00:20
exit函数确实挺奇怪的
1