在静态数组的情况下,bss的大小按意外字节递增

时间:2014-11-08 13:35:06

标签: c memory

请考虑以下代码:

#include<stdio.h>

int main()
{
    static int arr[20] = {0};
    return 0;
}

我在32位linux机器上使用gcc编译了上面的程序。然后我在可执行文件上运行了size命令。我得到的结果如下:

text       data     bss     dec     hex filename
1033        276     112    1421     58d ./a.out

程序中没有任何变量的结果是:

text       data     bss     dec     hex filename
1033        276       4    1313     521 ./a.out

所以,我的问题是:为什么增加了108个字节而不是80个字节。 我在这个网站上读到了一些答案,这是因为要求bss与32位对齐,但是84(4 - 早期+80(由于数组))已经是32位对齐。

编辑:

我尝试运行以下命令:

objdump -sSx a.out | grep bss

我得到的输出是:

 24 .bss          00000070  0804a020  0804a020  0000101c  2**5
0804a020 l    d  .bss   00000000              .bss
0804a020 l     O .bss   00000001              completed.6590
0804a040 l     O .bss   00000050              arr.1825
0804a090 g       .bss   00000000              _end
0804a01c g       .bss   00000000              __bss_start

第一行中的值2 ** 5表示对齐为32位,如本文所述:https://stackoverflow.com/a/18152865/2407962

但是,我真的不知道如何制作输出。请帮忙!

1 个答案:

答案 0 :(得分:0)

您可以使用以下两种方法自己回答这个问题:

  1. 从可执行文件生成内存转储:
  2. objdump -x --syms executable-file > output-file.dmp

    1. 在链接步骤中生成地图文件:
    2. gcc ... -Wl,-Map=map-file.map ...

      在这两个文件中,您都可以找到有关部分,对齐,放置等内容的所有信息。