【问题标题】:What does the text segment in a program's memory refer to? [duplicate]程序内存中的文本段指的是什么? [复制]
【发布时间】:2015-02-11 17:07:12
【问题描述】:

我无法理解文本段中存储的内容。到目前为止,我发现它包含我的程序的可执行代码(以 0 和 1 表示)。但是程序的整个内存不都包含可执行代码(即写成0和1)吗?我的意思是,一个程序首先被编译,然后是汇编,最后是链接,因此,一旦我们运行它,它就是二进制的。那么,一旦程序运行,栈帧就会在栈中为当前正在执行的函数创建,并且在这些栈帧中所有的变量都是 0 和 1,但是文本段里面是什么?

【问题讨论】:

  • 好吧,“0 和 1”部分已经不正确了。我的一些程序包含 2s、3s 等等——一直到 255。
  • clcto 没有回答我的问题
  • 等等,那个区域是否包含所有函数的原型?
  • @Root149:建议的重复问题的答案确实回答了您的问题:Unix 系统上程序的“文本”段是代码——机器代码,构成的函数程序(尤其包括main(),如果程序是用 C 或 C++ 编写的)。它还可以包含只读数据。 这就是您想知道的。是的,可执行文件中的所有代码和数据都可以视为二进制数据。二进制数据的某些部分可以解释为文本数据——例如,字符串以二进制形式存储但可以被视为文本。
  • "text" 是用于程序代码部分(有时称为段)的旧命名约定。 “数据”通常用于数据初始化数据。 “堆栈”用于堆栈。 “bss”代表由符号开始的块,用于未初始化的数据(可能是零)。另一个术语,主要用于大型机,是“bes”,代表以符号结尾的块,它是堆栈或类似数据的堆栈的替代方案。

标签: c memory memory-management text


【解决方案1】:

在“.text”段中,编译器将程序指令生成的“1”和“0”放入并编码这些指令,它通常是只读和可执行的。与包含编码变量值的 1 和 0 的“数据”段相反,它通常是 RW 且不可执行。堆栈通常驻留在数据段中,因为您没有向那里推送任何指令,只有数据。在物理内存中,文本段和数据段(以及其他一些部分)可能位于完全不同的位置,这些位置通常甚至不连续。即使它们在您的二进制文件中是连续的。这意味着,您的“文本”段可以位于地址 0x100,但数据位于 0x1000000。但这并不意味着您的可执行文件将是 0x1000000 大。

【讨论】:

  • 那么,在文本段中包含用二进制编写的实际函数定义吗?
【解决方案2】:

正如您所怀疑的,(有点奇怪的名字)text 部分(段)通常包含已编译的二进制代码。

一个可执行文件通常包含除代码之外的其他类型的数据,如初始化变量值、资源、调试信息、重定位数据等,它们被放置在具有其他名称的部分中。

【讨论】:

  • 那么,在文本段中包含用二进制编写的实际函数定义吗?
  • @Root149:是的,文本段包含组成程序的函数的编译体。它还可能包含其他材料:如果您没有使用共享库,那么它也可能包含来自库函数的代码;它还可能包含只读数据,例如字符串文字,因为文本段是只读的(没有自修改代码)。
猜你喜欢
  • 2019-08-11
  • 1970-01-01
  • 2014-11-06
  • 2020-02-11
  • 2014-06-04
  • 2013-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多