LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1409|回复: 3

gcc初始化全局静态变量,gcc各个版本不一样?

[复制链接]
发表于 2010-9-23 19:20:14 | 显示全部楼层 |阅读模式
  1. #include <stdio.h>
  2. static int inta;
  3. int intb;
  4. static int intc=0;
  5. int intd=0;
  6. static struct TT{
  7.         int a;
  8.         int b;
  9. } *pt = NULL;
  10. int main(void) {
  11.         printf("the content of pointer: %lu\n", (unsigned long)pt);
复制代码
为什么全局静态变量在有的版本下面是.data段,有的版本下却在.bss段下呢?
怎么才能让全局静态变量在.data段下面?也就是能被初始化??
Redhat7,gcc版本2.9.6下面:
  1. test.o:     file format elf32-i386
  2. SYMBOL TABLE:
  3. 00000000 l    df *ABS*  00000000 test.c
  4. 00000000 l    d  .text  00000000
  5. 00000000 l    d  .data  00000000
  6. 00000000 l    d  .bss   00000000
  7. 00000000 l       .text  00000000 gcc2_compiled.
  8. 00000000 l     O .data  00000004 intc
  9. 00000008 l     O .data  00000004 pt
  10. 00000000 l    d  .rodata        00000000
  11. 00000000 l     O .bss   00000004 inta
  12. 00000000 l    d  .note  00000000
  13. 00000000 l    d  .comment       00000000
  14. 00000004 g     O .data  00000004 intd
  15. 00000000 g     F .text  0000001e main
  16. 00000000         *UND*  00000000 printf
复制代码
fedora12,gcc版本4.4.2下面:
  1. test.o:     file format elf32-i386
  2. SYMBOL TABLE:
  3. 00000000 l    df *ABS*  00000000 test.c
  4. 00000000 l    d  .text  00000000 .text
  5. 00000000 l    d  .data  00000000 .data
  6. 00000000 l    d  .bss   00000000 .bss
  7. 00000004 l     O .bss   00000004 inta
  8. 00000008 l     O .bss   00000004 intc
  9. 0000000c l     O .bss   00000004 pt
  10. 00000000 l    d  .rodata        00000000 .rodata
  11. 00000000 l    d  .note.GNU-stack        00000000 .note.GNU-stack
  12. 00000000 l    d  .comment       00000000 .comment
复制代码
ubuntu10.04(64位),gcc版本4.4.3下面:
  1. test.o:     file format elf64-x86-64
  2. SYMBOL TABLE:
  3. 0000000000000000 l    df *ABS*  0000000000000000 test.c
  4. 0000000000000000 l    d  .text  0000000000000000 .text
  5. 0000000000000000 l    d  .data  0000000000000000 .data
  6. 0000000000000000 l    d  .bss   0000000000000000 .bss
  7. 0000000000000004 l     O .bss   0000000000000004 inta
  8. 0000000000000008 l     O .bss   0000000000000004 intc
  9. 0000000000000010 l     O .bss   0000000000000008 pt
  10. 0000000000000000 l    d  .rodata        0000000000000000 .rodata
  11. 0000000000000000 l    d  .note.GNU-stack        0000000000000000 .note.GNU-stack
  12. 0000000000000000 l    d  .eh_frame      0000000000000000 .eh_frame
复制代码
发表于 2010-9-25 11:26:02 | 显示全部楼层
恕我眼拙, 不同版本之间没有差异啊, 有的只是初始化和未初始化的全局变量间的差异.

我的理解是, bss里面全是0, 未初始化的全局变量放这既省空间又不影响0的初值. 而如果初始化了的全局变量, 因为不一定为0, 显然应该放到data里. 至于有没有手动初始化为0, 多加判断就引入了过多的复杂性..

下面是google来的:

.data段是数据段。它用来存放初始化了的(initailized)全局变量(global)和初始化了的静态变量(static)。它是可读可写的。

.bss段是全局变量数据段。它用来存放未初始化的(uninitailized)全局变量(global)和未初始化的静态变量(static)。它也是可读可写的。bss是英文Block Started by Symbol的缩写。之所以把bss跟data分开来,是因为系统会为这些bss段的变量的初值清零。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-9-25 17:49:18 | 显示全部楼层
谢谢您的回答,我说的就是它们的section不同,怎么才能把初始之是0的所有全局静态变量都放到data段吗?
回复 支持 反对

使用道具 举报

发表于 2010-9-25 19:16:53 | 显示全部楼层
Post by bijianing;2113418
谢谢您的回答,我说的就是它们的section不同,怎么才能把初始之是0的所有全局静态变量都放到data段吗?


看起来是优化导致的。.bss 段会被统一清零,效率较高。因此初始化为零的变量也被放到 .bss 了。如果你初始化为非零就会进入 .data。

如果一定在乎 .data 段的话,我估计 gcc 可能会有个优化相关的编译选项来控制这个问题。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表