【问题标题】:Does the stack frame for main have a saved frame pointer and a saved return address?main 的堆栈帧是否有保存的帧指针和保存的返回地址?
【发布时间】:2016-07-07 05:11:08
【问题描述】:

在C\C++程序的main函数的栈帧中,是否有保存的返回地址和保存的栈指针(ebp)?如果是这样,它们指向哪里,因为没有以前的堆栈帧要记录?

【问题讨论】:

  • 这些都不是 C 或 C++ 语言规范的一部分。这些是实现细节,任何实现都可以在它认为合适的时候处理这​​个问题。就操作系统而言,main 通常不是入口点。真正的入口点通常是语言支持实现的一部分(例如 CRT)。
  • 一般来说是的,但正如@IInspectable 已经指出的那样,这是一个实现细节,C 和 C++ 标准都不能保证。
  • 对于 C++,该语言要求某些代码可以在 main 之前执行,这意味着用户空间中的某些东西负责调用它们。

标签: c++ c callstack


【解决方案1】:

由 gcc、MSVC 和可能的其他编译器创建的 C\C++ 二进制文件也有一个入口点 _start,它是库的一部分并静态链接到可执行文件中。操作系统的 ELF/PE 加载程序为程序运行设置堆栈,并在调度时,CPU 返回_start,然后执行一些特定于库的设置并调用main。因此,在调用main 时,会存储一个返回地址,该地址会返回到 clib 函数,然后使用系统调用通知操作系统终止程序。

但是,正如 cmets 所指出的,这不是由语言标准本身定义的,只是它在现有系统中最常见的实现方式。

【讨论】:

  • 在 MSVC 的 CRT 实现中没有名为 _start 的符号。 Unicode 控制台应用程序的入口点称为wmainCRTStartup
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-24
  • 1970-01-01
  • 1970-01-01
  • 2013-12-22
相关资源
最近更新 更多