计算机系统:程序员的视角介绍了 ELF 可重定位目标文件中的两个部分:
。数据初始化的全局和静态 C 变量。局部 C 变量在运行时在堆栈上维护,不会出现在 .data 或 .bss 部分中。
.bss未初始化的全局和静态 C 变量,以及初始化为零的任何全局或静态变量。该部分在目标文件中不占用实际空间;它只是一个占位符。目标文件格式区分已初始化变量和未初始化变量以提高空间效率:未初始化变量不必占用目标文件中的任何实际磁盘空间。在运行时,这些变量在内存中分配,初始值为零。
引用中的“initialized”和“unitialized”是显式还是隐式的意思?
如果全局或静态 C 变量未显式初始化,而是隐式初始化,那么它是在 .data 还是 .bss 部分中?
全局或静态 C 变量是否隐式初始化为零或非零有关系吗?
.data 和 .bss 的要求并不相互排斥。 “初始化全局和静态 C 变量”的 .data 要求并未规定此类变量必须初始化为非零。因此,如果全局或静态 C 变量初始化为零,它应该位于 .data 还是 .bss 部分?
谢谢。
答案1
引用中的“initialized”和“unitialized”是显式还是隐式的意思?
“初始化”意味着变量在代码中的声明旁边被赋予一个显式值(可能为零)。 “未初始化”意味着变量在声明时未显式初始化,这在您的术语中对应于“隐式初始化”;如果它是全局变量,则其值为零。
如果全局或静态 C 变量未显式初始化,而是隐式初始化,那么它是在 .data 还是 .bss 节中?
根据你的报价:
.bss未初始化的全局和静态 C 变量
下一个:
全局或静态 C 变量是否隐式初始化为零或非零重要吗?
未初始化的全局变量默认为零值。
因此,如果全局或静态 C 变量初始化为零,它应该位于 .data 还是 .bss 部分?
根据你的报价:
.bss未初始化的全局和静态 C 变量,以及初始化为零的任何全局或静态变量。
请注意,这些都不是要求;特别是,它假设未初始化的数据段在平台上被初始化为与 C 中的零相对应的值。这是使用 ELF 的系统上的典型情况,但 C 允许用除全零之外的位模式来表示零。
.bss
然而在实践中,显式或非显式初始化为零的全局或静态变量是ELF 二进制文件的一部分。