【问题标题】:Why .bss size decrease when adding an initialized static variable?添加初始化的静态变量时,为什么 .bss 的大小会减小?
【发布时间】:2020-01-02 10:59:18
【问题描述】:

我了解.bss 的默认对齐方式是 GCC 的 8 个字节,如本问题 Why the int type takes up 8 bytes in BSS section but 4 bytes in DATA section 中所述

所以有了这个程序:

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

请告诉我为什么?

【问题讨论】:

  • .bss 不应该占用任何内存。我猜这种行为可能是由于对齐。它依赖于编译器的实现。
  • 您是否尝试过查看readelfnm 等的输出,看看是否可以确定bss 中的地址[es] 处的符号是什么?
  • @R..GitHubSTOPHELPINGICE 是的,我做到了,我也在查看 gcc 的默认链接器文件,因为我使用的是默认链接器文件。我想是从.bss.data的对齐方式上来的,但还是没弄明白其中的逻辑。
  • 我无法重现这个。您使用哪个编译器版本和标志编译了哪个架构?

标签: c gcc memory-management


【解决方案1】:

.bss 具有未初始化全局变量的 大小。这些将在加载程序时初始化为零。

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

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

【讨论】:

  • 该变量在第一个版本中不存在。所以没有移动未初始化的变量。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2012-02-01
    • 2019-06-27
    • 1970-01-01
    • 2016-01-19
    • 2019-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多