我们知道.bss包含未初始化的变量。如果在c代码中,程序员在使用它们之前初始化变量。然后.bss在执行C代码之前不必为零。
我是对的吗?
由于
答案 0 :(得分:13)
在C代码中,任何具有静态存储持续时间的变量都被定义为由规范初始化为0(第6.7.8节初始化,第10段):
如果未明确初始化具有静态存储持续时间的对象,则:
- 如果它有指针类型,则将其初始化为空指针;
- 如果它有算术类型,则初始化为(正数或无符号)零;
- 如果是聚合,则根据这些规则初始化(递归)每个成员;
- 如果是联合,则根据这些规则初始化(递归)第一个命名成员。
一些程序加载器将用零填充整个部分,其他程序将按需填充它作为性能改进。因此,虽然技术上正确,{C}代码开始执行时.bss
部分可能 在任何情况下,假设您有一个符合标准的工具链,您可以将其视为全零。
任何初始化为非零值的变量永远不会在.bss
部分结束;它们在.data
或.rodata
部分中处理,具体取决于其特定的特征。
答案 1 :(得分:4)
ELF规范说:
.bss此部分保留未初始化 有助于该计划的数据 记忆图像。根据定义, 系统用零初始化数据 当程序开始运行时。该 section不占用文件空间 由截面类型表示, SHT_NOBITS。
因此,具有分配给它的值的C全局变量不能放入.bss部分,并且必须进入.data部分。 .data部分包含分配给它的所有变量的初始值。
答案 2 :(得分:1)
这取决于变量在代码中的位置。例如,如果您正在讨论main()或任何其他函数中的局部变量,那么变量将被推送到堆栈中(除非您使用其他修改关键字)。如果您的变量是全局的且未初始化,则应将其保存在.bss中。请注意,编译器优化等可能会改变一些事情。如果你想知道肯定使用readelf来调查linux上的ELF二进制文件。
答案 3 :(得分:-1)
似乎您可能对.bss部分最终初始化为零的机制感到困惑。您编译的代码不一定要将区域显式初始化为零,因为当操作系统首先为进程分配新的内存页时,操作系统会确保页面初始化为零。这样做是出于安全原因,因此当其他进程退出时,进程无法查找内存中留下的秘密。