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

时间:2020-03-05 18:39:53  来源:igfitidea点击:

我在寻找更多技术说明,然后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的应用程序编程"。