Try_1:
int data;
int main()
{
printf("%d",data);
}
-bash-3.2$ size a.out
text data bss dec hex filename
1260 504 24 1788 6fc a.out
Try_2:
int data;
static int data2;
int main()
{
printf("%d",data);
printf("%d",data2);
}
-bash-3.2$ size a.out
text data bss dec hex filename
1292 504 24 1820 71c a.out
从上面的代码看,文件范围的静态变量看起来像是存储在文本部分中。有人能解释一下这种行为吗?我希望它存储在bss部分。
答案 0 :(得分:3)
size
工具不够精确,无法为您调查此问题。看起来你在Linux上,所以你可以尝试readelf
,这样可以提供更多信息。我把这个程序:
#include <stdio.h>
int data;
int main (void)
{
printf("%d",data);
return 0;
}
在名为sections.c
的文件中,然后使用gcc -o sections sections.c
对其进行编译。现在调用readelf -a sections >readelf.txt
给出了很多输出(可能在这里粘贴的答案太多了),但是有一些有趣的花絮。
首先,在符号表中的某个位置,您会看到类似
的行 56: 080496bc 4 OBJECT GLOBAL DEFAULT 25 data
(事后看来,使用比“数据”更容易搜索的名称可能会更好。)无论如何,这意味着data
符号的值为0x080496bc。这应该对应于变量的加载地址,因此我们现在可以查看节表。
有问题的部分:
[13] .text PROGBITS 08048300 000300 0001a2 00 AX 0 0 16
...
[24] .data PROGBITS 080496b0 0006b0 000008 00 WA 0 0 4
[25] .bss NOBITS 080496b8 0006b8 000008 00 WA 0 0 4
第一个十六进制列是该部分的起始地址,第三个是其大小。特别是,.bss
跨越[0x080496b8, 0x080496bf]
,其后四个字节为data
。多田!
答案 1 :(得分:1)
您应该期望每个部分都有与之关联的填充,这会使您的实验无效,除非您声明大型数组,例如int data[2048]
。