main函数真的是程序的起始么?如果不是,那么是谁在幕后呢?运行库(CRT)。
运行库职责的主要流程:
1.初始化和操作系统版本有关的全局变量
2.初始化堆
3.初始化I/O
4.获取命令行参数和环境变量
5.初始化C库的一些数据
6.调用mian并记录返回值
7.检查错误并将main的返回值返回
OS装载好程序后,首先运行的是别的代码,它们负责准备好main所需的环境,并调用main函数,在main返回后,会记录main函数的返回值,然后调用atexit注册的函数,最后结束进程。
运行这些代码的函数称为入口函数。实际上就是一个程序的初始化和结束部分,它就是CRT的一部分。
glibc真正的程序入口为_start:
主要分为两部分,即线分隔开的两部分
ebp清零来表示层级,esi存放argc,ecx指向argv(环境变量就在命令行参数后面)。第二部分就是压参数然后调函数。
调用__libc_start_main函数内容如下:
总结:运行库主要是开头和扫尾工作。