我正在寻找一个更技术性的解释然后OS调用该函数.任何人都可以帮助我或指向我的网站或书籍吗?
.exe文件(或其他平台上的等效文件)包含"入口点"地址.对于第一个近似值,OS将.EXE文件的相关部分加载到ram中,然后跳转到入口点.
正如其他人所说的那样,这个入口点不是'main',而是成为运行时库的一部分 - 它会做一些事情,比如初始化静态对象,设置argc/argv参数,设置stdin/stdout/stderr完成所有这些后,它将调用你的main()函数.当主要退出时,运行时会经历一个将返回代码传递回环境,调用静态析构函数,调用_atexit例程等的类似过程.
如果您有MS工具(可能不是免费赠送的工具),那么您拥有所有运行时源,并且一种简单的方法来查看它是在main()方法的右括号上放置一个断点,并单步备份进入运行时.
main()
是C库的一部分,不是系统功能.我不知道OS X或Linux,但Windows通常会启动一个程序WinMainCRTStartup()
.此符号初始化您的进程,提取命令行参数和环境(argc, argv, end
)以及调用main()
.它还负责调用任何应该运行的代码main()
,比如atexit()
.
通过查看Visual Studio文件,您应该能够找到默认实现,WinMainCRTStartup
以查看它的作用.
您还可以定义自己的函数以在启动时调用,这可以通过更改链接器选项中的"入口点"来完成.这通常是一个不带参数并返回void的函数.
就Windows而言,入口点功能是:
安慰: void __cdecl mainCRTStartup( void ) {}
GUI: void __stdcall WinMainCRTStartup( void ) {}
DLL: BOOL __stdcall _DllMainCRTStartup(HINSTANCE hinstDLL,DWORD fdwReason,void* lpReserved) {}
在普通的main/WinMain/DllMain上使用这些的唯一原因是你想要使用自己的运行时库(如果你想要更小的文件大小或自定义功能)
对于自定义运行时实现和其他获取较小PE文件的技巧,请参阅:
http://www.microsoft.com/msj/archive/S569.aspx
http://www.codeproject.com/KB/tips/aggressiveoptimize.aspx
http://www.catch22.net/tuts/minexe.asp
http://www.hailstorm.net/papers/smallwin32.htm