程序的开始与终止

main 函数与程序的启动

main没有原型,启用main需要一个特殊的启动流程

1
2
3
4
int
main(int argc, char *argv[]) {
    printf("main is at 0x%lX\n", (unsigned long)&main);
}

使用c89标准编译后的输出结果与readelf的entry point不同
使用gdb,发现_start,先跳转到___start,启动_exit__libc_init,然后跳入main
执行完程序内所有行为后回到___start
阅读crt0.S发现内存布局和库函数相关的初始化数据(源实验环境为NetBSD)
cc中可以使用-e指定程序的入口函数
在gdb中查看$rip发现非法的地址访问,产生了段错误,当将这个指定的入口函数使用exit()退出时程序段错误消失

程序的终止

在C89中没有return的main返回20,而在C99中,这个返回值变成了0
return被视为对一个变量的使用
exit()退出程序时会使用atexit(),冲刷所有的输出流,关闭所有开放的流,断开使用tmpfile()建立的所有链接,最后调用_exit()系统调用直接关闭线程
atexit()将以相反的顺序寄存所有调用exit()的函数
exit()也会调用exit_handler.c进行相应的操作

Maybe making a better tomorrow...
Built with Hugo
Theme Stack designed by Jimmy