c语言 - 为什么 size 命令显示的 bss 值即使在添加未初始化的全局变量后也不会增加?



我正在使用Ubuntu 64位,我正在尝试找到以下各种变量的.bss段的大小。

第一个程序:

#include <stdio.h>
main()
{
}

size命令在以上程序生成的可执行文件中给出以下结果。

text       data     bss     dec     hex filename
1115        552       8    1675     68b a.out

第二个程序:

#include <stdio.h>
int a = 10;
main()
{
}

size命令在以上程序生成的可执行文件中给出以下结果。

text       data     bss     dec     hex filename
1115        556       4    1675     68b a.out

第三个程序:

#include <stdio.h>
int a;
main()
{
}

size命令在以上程序生成的可执行文件中给出以下结果。

text       data     bss     dec     hex filename
1115        552       8    1675     68b a.out

注意:

我在编译时没有使用任何标志。

某个问题可以在以下问题吗?

1) Why `bss` is 8 bytes for first program even though there are no uninitialized global or static variables?
2) Why `bss` is reduced to 4 bytes when I added initialized global variable in second program?
3) Why `bss` is showing 8 bytes for the third program?
4) What are dec and hex in the output given by size command?

这是您的同事。您离开之前我可以告诉您您的答案。

1)为什么BSS对于第一个程序为8个字节,即使没有 非初始化的全局或静态变量?

我对此没有明确的答案。我怀疑编译器正在为某些东西使用4个字节,并且由于数据段已经为69*8 = 552,因此必须为BSS分配完整的8个字节。

2)当我添加初始化的全局时,为什么BSS减少到4个字节 第二个程序中的变量?

data bss将始终可以由8分组。由于您的程序只需要4个字节,因此编译器将未使用的字节从BSS中输入数据段。

3)为什么BSS显示第三个程序的8个字节?

这可以追溯到1和2,当您不初始化变量时,它将被放入BSS中。此时,BSS中有2个(" A" 内部编译器变量)变量。您可以通过添加其他非初始化变量来对其进行测试。您添加的所有其他变量(从第一个开始,如果BSS为4)将使BSS增加8。

4)大小命令给出的输出中的DEC和十六进制是什么?

数据 文本 bss = dec,在十六进制中相同的值

希望这会有所帮助。如果您想了解更多,请在我的桌子上摆动。

相关内容

最新更新