在C / C ++程序如何在系统(Windows,Linux和MAC OS X)调用main()函数

2019-06-28 00:54发布

我要寻找一个更技术性的解释,则操作系统调用该函数。 任何人都可以帮我或点我到一个网站或书籍?

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:

你可以看看下面的链接:

  • 主功能
  • 入口点
  • 微软特定主


文章来源: In a C/C++ program how does the system (windows, linux, mac OS X) call the main() function
标签: c++ c main