程序最早执行的函数时什么函数:
最早执行的函数是 mainCRTStartup 。
在终端程序中,main 函数是用户定义的执行入口点,当程序编译成功之后,连接器(linker)会将 mainCRTStartup 连接到 exe 中,所以 exe 执行时,一开始执行的就是 mainCRTStartup,而不是main。
在有 Windows 界面中,是 WinMainCRTStartup(或wWinMainCRTStartup) 函数
这是因为程序在执行时会调用备种各样的运行时库函数,因此程序执行之前必须要先初始化好运行时库,mainCRTStartup 函数会负责相应的初始化工作(调用 CRTlinit 函数),它会完成一些 C 全局变量以及 C 内存分配等函数的初始化工作,如果使用 C++ 编程,还要执行全局类对象的构造函数。最后,mainCRTStartup 才调用 main 函数。
如何在 main 前插入一段代码:
在 linux 中:在 gcc 编译器中可以使用 attribute 关键字来声明 constructor 和 destructorC 函数
__attribute((constructor)) void befor_main()
{
pass; // the code
}
在 Windows 中:在 VC 中不支持 attribute 关键字,我们将函数插入函数表 [__xi_a,__xi_z](c)
和 [__xc_a,__xc_z](c++)
中,他们都会被 CRTInit 调用
typedef int func();
int befor_main()
{
pass; //the code
}
#pragma data_seg(".CRT$XIU")
static func * before1[] = {befor_main};