为什么即使添加了未初始化的全局变量,size命令显示的bss值也不会增加?

时间:2017-09-12 20:30:29

标签: c ubuntu

我正在使用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 个答案:

答案 0 :(得分:3)

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

  

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个(&#34; a&#34; +内部编译变量)变量。您可以通过添加其他未初始化的变量来测试它。您添加的每个其他变量(从第一个开始,如果bss为4)将使bss增加8。

  

4)size命令给出的输出中的dec和hex是什么?

data + text + bss = dec,十六进制相同的值

希望这会有所帮助。 如果您想了解更多信息,请在我的办公桌前摆动。