二进制文件的加载程序可以填充内存区域吗?

Can a loader of a binary fill a memory area?

我在我的机器上做一些测试,我发现当我不初始化一个变量时,它的值趋向于0,但它只用0初始化,当代码编译为64时位,经过一些测试,我验证似乎是二进制文件的加载器将内存地址填充为 0,而不是编译器。想确认一下是否真的是loader把值置为0,感激不尽

#include <stdio.h>

int x; //section .bss

int main(void) {
    printf("%d\n", x);
    return 0; 
}

I'm doing some tests here on my machine, and I realized that when I do not initialize a variable, its value tends to be 0,

如果一个静态存储持续时间的变量(比如你的x)定义时没有初始化,那么它的初始值为0(算术类型)或空指针(指针类型),否则它是聚合类型,其成员根据这些规则(递归)初始化,或者它是联合类型,其第一个成员根据这些规则初始化。这是由语言标准的 paragraph 6.7.9/10 指定的,因此在符合规范的实施中 "tends to be" 太弱了。

但请注意,这不适用于自动变量(那些在块范围内声明且没有存储 class 说明符的变量)。如果一个自动变量在没有初始化器的情况下声明,那么它的初始值是不确定的,如果你在没有首先设置它的情况下使用这样一个对象的值,那么行为是不确定的。也许这就是你进行对冲的原因。

but it is only initialized with 0, when the code is compiled to 64 bits,

如果我们谈论的是一致性实现,那么目标架构的字长与它无关。

after some tests , I verified that it seems to be the loader of the binary that fills the memory address with value 0, not the compiler.

这取决于实现。 C 没有指定。但是,您标记了 ELF,并且针对 ELF 的 C 实现通常将 default-initialized 对象分配给 BSS 部分,这几乎是为此目的而设计的。 BSS 在磁盘上不占用 space 但加载时它被初始化为 all-bits-zero.

I would like to confirm if it is actually loader that puts the value 0, grateful

程序加载器,无论在任何给定实现中采用何种形式,都会为每个具有静态持续时间的变量设置初始值,无论它是否使用初始化程序定义。它可以通过从磁盘加载值来实现,或者在某些情况下,通过 zero-filling 它而不从磁盘加载特定值,或者可能通过一些其他机制来实现。如前所述,对于分配给 ELF 对象的 BSS 部分的变量,加载器(在本例中为动态链接器)zero-fills 表示。