蓝森林首页 | 返回主页 | 本站地图 | 站内搜索 | 联系信箱 |
 您目前的位置:首页 > 自由软件 > 技术交流 > 应用编程


    

蓝森林 http://www.lslnet.com 2006年6月6日 10:18


[初级问题]static修饰的变量存在哪里

有人问我这个问题,我回答是静态存储区,当然这和书上的答案一致,他又问我用英文名称怎么表示.我就迷糊了,回答data段里,他说不是
刚才用nm查看了一下,未初始静态变量显示为b,初始化之后显示为d,不知道究竟静态存储区用英文名怎么表达?

.bss段 和.rdata段吧好像是

初始化为非零值的静态分配数据和全局数据存在数据段中,运行相同程序的每个进程都有自己的数据段。
初始化为零值的静态分配数据和全局数据存放在进程的BSS区域内。
-----------------------------------------------实战linux编程精髓
我理解的第一句中的数据段指的是数据节
第二句中的BSS区域指的是BSS节
数据节和BSS节在程序的地址空间中都是数据段

自已写些代码作个实验岂不比在这里讨论强?

-->
难道static a=0;里的a也放在.bss段中吗?

回复 5楼 hezhiroy 的帖子

* .bss

该sectiopn保存着未初始化的数据,这些数据存在于程序内存映象中。
通过定义,当程序开始运行,系统初始化那些数据为0。该section不占
文件空间,正如它的section类型SHT_NOBITS指示的一样。

看来初始化为零和不初始化没啥区别啊

(gdb) p &a
$1 = (int *) 0x8049544
(gdb) p &b
$2 = (int *) 0x8049538
(gdb) p &c
$3 = (int *) 0x8049548
(gdb) p &d
$4 = (int *) 0x804954c
(gdb) p &e
$5 = (int *) 0x8049540
(gdb) p &f
$6 = (int *) 0x8049534
(gdb)


int d;
int e = 0;
int f = 10;
int main(int argc, char** argv)
{
  static int a=0;
  static int b = 10;
  static int c;
}
[Nr] Name              Type            Addr               Off         Size   ES Flg  Lk Inf Al
[22] .data             PROGBITS        08049528 000528 000014 00  WA  0   0  4
[23] .bss              NOBITS             0804953c 00053c 000014 00   WA  0   0  4


data节加载入内存后从08049528-->08049528+14
.bss节加载入内存后从 0804953c --> 0804953c +14
所以fb位于.data节
eacd位于.bss节

54c           d
548           c
544           a
540           e
53c-----------^.bss
538           b
534           f
528-----------^.data


实战linux编程精髓上说的没错。。。。:D:D:D


-->

我已经写代码测过了,用nm查看是b和d,按nm的说法似乎是bss和data
但是我用gcc -S编译出的汇编代码为
.local  d.0
.comm   d.0,4,4
然后赋值
movl    $3, d.0
我不明白.local指令有啥用,这种情况究竟是在哪个段

然后又反汇编
movl   $0x3,0x8049554
但是我就不知这个0x8049554是哪个段里,因为反汇编出来的不到这个地址已经结束了.

用read-elf -a 察看.bss .data加载到内存中后的地址范围就行了

-->
这个用什么命令看,谢谢

readelf -a
或者
objdump -h

-->
谢谢,
readelf -S就行了,第一次用这个命令,估计他希望我答bss,看来nm得到的结果已经是OK的了

嗯,可能是

从 C/C++ 语言的角度出发,只要了解对象的存储区分为静态存储(static storage)、自动存储(automatic storage)和动态分配存储(allocated or dynamic storage)就可以了。

如果和操作系统的概念结合起来,自动存储区对应着栈(stack),动态分配存储区对应着堆(heap),静态存储区又可细分为 .bss、.data、.rodata 等段(section)。


>> 估计他希望我答bss,看来nm得到的结果已经是OK的了

应该根据此 static 修饰的变量的初始化情况来决定是位于 .bss 段还是 .data 段。

-->
谢谢,书上都没讲这么细



Copyright © 1999-2000 LSLNET.COM. All rights reserved. 蓝森林网站 版权所有。 E-mail : webmaster@lslnet.com