main函数调用之前发生了什么?

在C++程序中,启动过程涉及多个函数调用,包括__scrt_common_main()、__scrt_common_main_seh()和invoke_main()。这些函数在main函数被调用前执行,负责线程初始化和传递命令行参数。程序结束时会调用exit函数。
摘要由CSDN通过智能技术生成

启动函数

系统内核KERNEL32.dll调用mainCRTStartup,其中再调用main函数。

通过调用堆栈观察

Created with Raphaël 2.3.0 kernel32.dll mainCRTStartup() __scrt_common_main() __scrt_common_main_seh() invoke_main() 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函数调用最近的有三个参数的函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值