gpt4 book ai didi

c++ - 静态变量的位置

转载 作者:搜寻专家 更新时间:2023-10-31 01:04:50 24 4
gpt4 key购买 nike

尝试_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

尝试_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 部分。

最佳答案

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。多田!

关于c++ - 静态变量的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23316185/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com