我要寻找一个更技术性的解释,则操作系统调用该函数。 任何人都可以帮我或点我到一个网站或书籍?
Answer 1:
该.exe文件(或等值其他平台)包含一个“切入点”地址。 第一近似,在OS加载.EXE的相关部分文件到RAM中,然后跳转到入口点。
正如其他人所说,这个入口点不会是“主”,而是将是运行时库的一部分 - 它会做这样的事情初始化静态对象,建立的argc / argv的参数,设置标准输入/输出/标准错误等。当它完成了这一切,它会调用你的main()函数。 当主退出,运行时经过传递的返回代码回到环境中,调用静态析构函数,调用_atexit程序等,以相似的过程
如果你有MS工具(也许不是免费搭乘的),然后你把所有的运行时间源,并寻找一种简单的方法它是把一个断点在你的main()方法的右括号和单步备份到运行时。
Answer 2:
main()
是C的库的一部分,而不是一个系统功能。 我不知道OS X或Linux,但Windows通常启动一个程序WinMainCRTStartup()
这个符号初始化你的过程,提取命令行参数和环境( argc, argv, end
),并调用main()
它还负责调用应后运行任何代码的main()
像atexit()
通过查看您的Visual Studio中的文件,你应该能够找到的默认实现WinMainCRTStartup
来看看会发生什么。
您也可以定义自己在启动时调用的函数,这是通过在连接选项改变“切入点”来完成。 这通常是一个函数,它没有参数,并返回一个空。
Answer 3:
至于窗户进入,入口点函数:
- 控制台:
void __cdecl mainCRTStartup( void ) {}
- GUI:
void __stdcall WinMainCRTStartup( void ) {}
- DLL:
BOOL __stdcall _DllMainCRTStartup(HINSTANCE hinstDLL,DWORD fdwReason,void* lpReserved) {}
在正常主/ 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
Answer 4:
专家C ++ / CLI (检查第259页左右)具有不同的引导场景原生,混合和纯CLR组件非常具体的细节。
Answer 5:
这取决于操作系统。 在OS X,有在包含起始地址EIP(指令指针)寄存器中的马赫报头的帧。
一旦二进制被加载,OS启动从这个地址执行:
cristi:test diciu$ otool -l ./a.out | grep -A 10 LC_UNIXTHREAD cmd LC_UNIXTHREAD cmdsize 80 flavor i386_THREAD_STATE count i386_THREAD_STATE_COUNT [..] ss 0x00000000 eflags 0x00000000 eip 0x00001f8c cs 0x00000000 [..]
地址是从二进制“开始”函数的地址:
cristi:test diciu$ nm ./a.out 0000200c D _NXArgc 00002008 D _NXArgv 00002000 D ___progname 00001fe0 t __dyld_func_lookup 00001000 A __mh_execute_header [..] 00001f8c T start
在Mac OS X,它是最先被称为“启动”功能,甚至在“主要”功能:
(gdb) b start Breakpoint 1 at 0x1f90 (gdb) b main Breakpoint 2 at 0x1ff4 (gdb) r Starting program: /Users/diciu/Programming/test/a.out Reading symbols for shared libraries ++. done Breakpoint 1, 0x00001f90 in start ()
Answer 6:
如果你有兴趣在与Windows和Win32 API尝试书
“编程应用程序用于Microsoft Windows”的杰弗里里希特。
Answer 7:
你可以看看下面的链接:
- 主功能
- 入口点
- 微软特定主