首页 / 知识

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

2023-04-12 06:53:00

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

In a C/C++ program how does the system (windows, linux, mac OS X) call the main() function

我在寻找更多技术说明,然后操作系统调用该函数。
谁能帮我或将我指向网站或书吗?


.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的应用程序编程"。


您可以查看以下链接:

  • 主功能
  • 入口点
  • Microsoft特定主要

函数调用系统操作

最新内容

相关内容

热门文章

推荐文章

标签云

猜你喜欢