请考虑以下代码:
#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
但是,我真的不知道如何制作输出。请帮忙!
答案 0 :(得分:0)
您可以使用以下两种方法自己回答这个问题:
objdump -x --syms executable-file > output-file.dmp
gcc ... -Wl,-Map=map-file.map ...
在这两个文件中,您都可以找到有关部分,对齐,放置等内容的所有信息。