为什么在添加初始化的静态变量时,.bss大小会减少?

3

我知道在这个问题(为什么int类型在BSS段占用8个字节,在DATA段占用4个字节)中提到,对于GCC而言,.bss的默认对齐方式为8字节。

所以对于这个程序:

int main(){
    
    return 0;
}

我有类似这样的东西:

   text    data     bss     dec     hex filename
   1418     544       8    1970     7b2 test

当我添加一个带有初始化的静态变量以增加 .data 时(它确实做到了):

static int var = 255;

int main(){
    
    return 0;
}

我看到.bss的大小也减少了4个字节:

  text     data     bss     dec     hex filename
  1418      548       4    1970     7b2 test

请问为什么?


2
.bss 不应该占用任何内存。我猜这种行为可能是由于对齐方式造成的。它取决于编译器的实现。 - Raman
你尝试过查看readelfnm等工具的输出,以确定在bss中哪些地址有符号吗? - R.. GitHub STOP HELPING ICE
@R..GitHubSTOPHELPINGICE 是的,我看了一下gcc的默认链接器文件,因为我正在使用默认链接器文件。我认为这是由于.bss.data之间对齐方式的问题,但仍然没有找到逻辑。 - Van Tr
1
我无法重现这个问题。请问您使用哪个架构、哪个编译器版本和标志进行编译的? - Armali
2个回答

1

.bss 段存储未初始化的全局变量,其大小为 size。程序加载时,这些变量将被初始化为零。

如果将全局变量初始化为非零值,则它将不再在 .bss 段中,而是在 .data 段中。数据段包含所有已初始化的全局变量(及其初始值)。

因此,.bss 的大小减小,而 .data 的大小增加。


3
该变量在第一个版本中不存在,因此没有未初始化的变量被移动。 - Frankie_C

0
可能是因为通过保留基本的8个字节来初始化bss,引入了所有的零,这样内存管理器就不会读取垃圾数据,但当我们最终创建一个适合4个字节的变量时,bss会被减少(以占用尽可能少的内存)。

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