在C / C ++程序中,系统(Windows,Linux,Mac OS X)如何调用main()函数
我在寻找更多技术说明,然后OS调用了该函数。
谁能帮我或者将我指向网站或者书吗?
解决方案
回答
main()是C库的一部分,不是系统函数。我不知道OS X或者Linux,但是Windows通常使用WinMainCRTStartup()启动程序。这个符号初始化进程,提取命令行参数和环境(argc,argv,end
)并调用main()
。它还负责调用应在main()之后运行的任何代码,例如atexit()。
通过查看Visual Studio文件,我们应该能够找到WinMainCRTStartup的默认实现以查看其作用。
我们还可以定义自己的函数以在启动时调用,这是通过更改链接器选项中的"入口点"来完成的。这通常是一个不带参数并返回void的函数。
回答
我们可以查看以下链接:
- 主功能
- 入口点
- Microsoft特定主要
回答
.exe文件(或者其他平台上的等效文件)包含一个"入口点"地址。首先,操作系统将.EXE文件的相关部分加载到ram中,然后跳转到入口点。
正如其他人所说,该入口点将不是" main",而是将成为运行时库的一部分,它将执行诸如初始化静态对象,设置argc / argv参数,设置stdin / stdout / stderr,等等。完成所有操作后,它将调用main()函数。当main退出时,运行时将经历一个类似的过程,将返回代码传递回环境,调用静态析构函数,调用_atexit例程等。
如果我们拥有MS工具(也许不是免费工具),那么就拥有了所有的运行时源,一种简单的查看方法是在main()方法的右括号处设置一个断点,然后单步备份进入运行时。
回答
专家C ++ / CLI(请参阅第279页)非常详细地介绍了本机,混合和纯CLR程序集的不同引导方案。
回答
它取决于操作系统。
在OS X中,mach标头中有一个框架,其中包含EIP(指令指针)寄存器的起始地址。
加载二进制文件后,操作系统将从以下地址启动执行:
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 ()
回答
就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
回答
如果我们对与Windows和Win32 API有关的书感兴趣,请尝试
Jeffrey Richter的" Microsoft Windows的应用程序编程"。