我在寻找更多技术说明,然后操作系统调用该函数。
谁能帮我或将我指向网站或书吗?
.exe文件(或其他平台上的等效文件)包含一个"入口点"地址。首先,操作系统将.EXE文件的相关部分加载到ram中,然后跳转到入口点。
正如其他人所说,该入口点将不是" main",而是将成为运行时库的一部分-它会执行诸如初始化静态对象,设置argc / argv参数,设置stdin / stdout / stderr之类的操作等。完成所有操作后,它将调用main()函数。当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 ) {}
-
界面: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
它取决于操作系统。
在OS X中,mach标头中有一个框架,其中包含EIP(指令指针)寄存器的起始地址。
加载二进制文件后,操作系统将从以下地址启动执行:
1 2 3 4 5 6 7 8
| 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
[..] |
该地址是二进制文件中"启动"功能的地址:
1 2 3 4 5 6 7 8
| 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中,首先调用"开始"功能,甚至在"主"功能之前调用:
1 2 3 4 5 6 7 8 9
| (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 () |
Expert C ++ / CLI(请参阅第279页,此内容非常详细)详细介绍了本机,混合和纯CLR程序集的不同引导方案。
如果您对与Windows和Win32 API有关的书感兴趣,请尝试
Jeffrey Richter撰写的" Microsoft Windows的应用程序编程"。
您可以查看以下链接: