静态变量的位置

时间:2014-04-26 20:31:20

标签: c++ c

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部分。

2 个答案:

答案 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]