1

我一直在使用 C++ 编译器(Win32 是目标)在 Visual Studio 2010 中编译简单的 Hello World 应用程序,以查看使用 Immunity 调试器运行产品时在显微镜下的样子。然而,我注意到有一些代码(实际上是相当多的代码)在我的 main 函数到达之前运行。很多这些东西看起来与安全相关,或者可能让系统准备好管理流程或其他什么,但那里只有大量的东西。此外,PE 文件头的 EntryPoint 部分似乎指向我的 .text 段的内部,而我的 main() 函数似乎位于 .text 段的最开头。我的问题是这样的:是否有一些关于这个前奏的好文档被拍到我的代码前面和/或 main() 函数通常由 VC++ 编译器放置在 .text 段的开头?感谢您的任何见解!

4

2 回答 2

1

编译器将您的用户代码放在段的开头,.text因为您希望在那里找到您的代码。所有其他非用户代码都放在最后,这是程序按预期工作所必需的,但您无需担心。在编写 C 程序时,您希望某些东西可用,例如本地数组中的命令行参数、初始化全局变量、确保标准 I/O 可用以及 C 运行时所需的重要其他东西初始化。

如果您查看例程的源代码,注释会解释为什么需要它。

这些例程进行 C 运行时初始化,调用适当的用户入口函数,并处理终止清理。对于托管应用程序,它们会将退出代码返回给调用例程,即托管启动代码。对于非托管应用程序,它们调用 exit 并且永不返回。

于 2010-10-06T23:51:17.600 回答
1

不确定 2010 年,但旧的 VC6 曾经附带其 CRT 的源代码,包括包含此初始化代码的文件(称为 crtexe.c)。

命令行应用程序中的默认入口点称为 mainCRTStartup。

于 2010-10-06T21:43:41.397 回答