|
蓝森林 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 段。 |
-->
谢谢,书上都没讲这么细 |
| |