启动函数
系统内核KERNEL32.dll调用mainCRTStartup,其中再调用main函数。
通过调用堆栈观察
__scrt_common_main()
__security_init_cookie()
//初始化缓冲区溢出全局变量,检查缓冲区是否溢出
__scrt_common_main_seh()
_initterm_e(__xi_a,__xi_z)
//初始化c语法全局数据
//参数类型为 (_PIFV *):一个函数指针数组,保留了每个初始化函数的地址
//_PIFV原型定义如下:
//typedef int(__cdecl* _PIFV)(void)
//是一个函数指针
//__xi_a是起始地址,z是结束地址
//初始化失败返回0
_initterm(__xc_a,__xc_z)
//初始化c++全局数据,全局对象以及IO流等,数据链初始化
//C++对象在main函数开始前构造,其构造函数就是_PIFV调用的。
后面对线程初始化
invoke_main()
传递命令行参数信息
_argc
_argv
_env
如何寻找
启动函数中唯一有三个参数的
结束后调用exit函数
查找距离exit函数调用最近的有三个参数的函数