当代码段,数据段或编译c程序时创建?

时间:2014-03-11 22:49:43

标签: c

我正在尝试理解C程序的编译过程。预处理程序被提供给编译器(用于创建obj文件)。编译器将检查编译错误。但在某处我读到了代码段,数据段将由编译器创建,并将相应的条目放入这些段中。这是对的吗?

编译器如何在内存中创建段?因为我们还没有开始运行该程序。任何人都可以让我知道编译器执行的具体操作是什么?

3 个答案:

答案 0 :(得分:2)

正如您所提到的,文本和数据段(以及技术上的BSS)是由编译器生成的。该文本包含程序代码,该数据包含全局和静态数据。这些都是磁盘上二进制映像的一部分。

堆栈和堆不是由编译器创建的,而是在运行时分配的 - 它们只在进程仍处于活动状态时才存在于内存中。

答案 1 :(得分:1)

编译器不加载程序。它只创建可执行文件。

文本部分和数据部分由编译器创建并放置在的正确位置,但仅位于可执行文件中。可执行文件实际上只是由对运行时加载程序的描述和指令组成,以告诉它在运行时放置代码和数据的位置。

答案 2 :(得分:1)

这很简单 所以代码段用于指令,数据段用于全局和静态变量 很明显,编译器最终知道代码段和数据段的大小,以及加载程序/库所需的内存量。

实际上并不是内存分配 - 这会在运行时发生 但重点是处理器的指令指针不应该脱离代码段。这使得代码块的长度非常重要。