如何.bss部分初始化为零

ric*_*ard 4 c gcc elf

我们知道.bss包含未初始化的变量.如果在c代码中,程序员在使用它们之前初始化变量.然后.bss在执行C代码之前不必为零.

我对吗?

谢谢

Car*_*rum 13

在C代码中,任何具有静态存储持续时间的变量都被定义为由规范初始化为0(第6.7.8节初始化,第10段):

如果未显式初始化具有静态存储持续时间的对象,则:

  • 如果它有指针类型,则将其初始化为空指针;
  • 如果它有算术类型,则初始化为(正或无符号)零;
  • 如果是聚合,则根据这些规则初始化(递归)每个成员;
  • 如果它是一个联合,则根据这些规则初始化(递归)第一个命名成员.

一些程序加载器将用零填充整个部分,并且其他程序将"按需"填充它作为性能改进.因此,尽管技术上正确,当C代码开始执行时,该.bss部分可能并不真正包含全零,但逻辑上确实如此.在任何情况下,假设您有一个符合标准的工具链,您可以将其视为全零.

任何初始化为非零值的变量都不会在该.bss部分中结束; 它们根据其特定特征在一个.data或多个.rodata部分中处理.


dor*_*ron 5

ELF规范说:

.bss本节保存有助于程序存储映像的未初始化数据。根据定义,当程序开始运行时,系统将数据初始化为零。该节不占用文件空间,如节类型SHT_NOBITS所示。

因此,得出的结论是,已为其分配了值的C全局变量无法放入.bss部分,而必须进入.data部分。.data节包含分配给它的所有变量的初始值。