关于Unix中的bss段和数据段

5

我在Unix课本上读到,bss用于存储未初始化的变量(全局声明)。这意味着静态变量是单独存储的,而不是在bss中。唯一的其他地方是数据段。

我的问题是:bss段是数据段的一部分还是它们是完全不同的内存段?此外,为什么要将全局变量与静态变量分开存储?

2个回答

12

虽然对于本地符号、小型引用、共享库等内容进行了层层混淆,但原始思想仍然存在。

不过一切仍然基于原始的简单模型,因此值得了解。这个想法是有三个段落的:

  • .text
    这里有程序代码。
  • .data
    这里有初始化数据。
  • .bss
    这里有未初始化的数据。

.bss则很特殊:它的对象在对象文件中不占用任何空间,并且通过将所有未明确初始化的符号分组在一起,可以轻松将它们全部清零。

静态有几个含义。在某种意义上,它只是一个符号属性,告诉链接器它是对象模块局部的还是可以与同名的其他符号进行全局链接的。它也用于指定存储期限,以区分函数内的对象和自动(堆栈分配)对象。

因此,静态变量可以是初始化或未初始化的,全局变量也可以是如此,具体取决于它是否被初始化。


很好的回答,但你忘记了.rodata :-) - Mads Elvheim
嘿,我还没提到过伟大的未定义值技巧。 "Common blocks"(每个bss符号,包括Fortran common和单个C extern或全局未初始化对象)可以有值,这些值是它们的大小。如果仍未定义,则链接器将取最大值并分配bss空间(并定义它),但如果.data段标签定义了该符号,则它获胜。这种简单的技术非常有效,我认为它处理了所有已知的语言。当然,它处理了所有常见的语言。 - DigitalRoss

0

bss 传统上被称为未初始化的变量,但 C 和 Unix 保证它们被初始化为零。(参见this。)它是数据段的一部分,通常位于程序静态初始化变量空间的右侧。在内存中比 bss 更高的位置通常是堆的开始。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接