未初始化的全球数据的部分是什么?

时间:2011-03-26 16:00:35

标签: gcc elf

我对ELF文件中未初始化的全局变量的位置感到有些困惑。我有这个简单的程序来测试变量将位于哪个部分:

const int a = 11;
int b = 10;
int c;

int main()
{
    return 0;
}

我知道未初始化的全局变量应放入ELF文件的.bss部分,但是objdump -h给出了以下输出:

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         0000000a  00000000  00000000  00000034  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .data         00000004  00000000  00000000  00000040  2**2
                  CONTENTS, ALLOC, LOAD, DATA
  2 .bss          00000000  00000000  00000000  00000044  2**2
                  ALLOC
  3 .rodata       00000004  00000000  00000000  00000044  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  4 .comment      00000024  00000000  00000000  00000048  2**0
                  CONTENTS, READONLY
  5 .note.GNU-stack 00000000  00000000  00000000  0000006c  2**0
                  CONTENTS, READONLY

所以变量a转到.rodata,b转到.data,而c转到哪里?当我将代码更改为:

int c = 0;

一切都如预期的那样 - .bss部分的长度为4,但是当它未初始化时,变量c会发生什么?

1 个答案:

答案 0 :(得分:1)

它进入了“共同部分”。您可以使用objdump -t或使用nm来查看。

我不太清楚我明白这是什么意思,但对ld -warn-common标志的引用说明了这一点:

int i;
  

一个常见的符号。如果只有   (一个或多个)a的常用符号   变量,它是未初始化的   输出文件的数据区域。该   链接器合并多个公共符号   将同一变量合并为一个   符号。如果他们是不同的   尺寸,它选择最大的尺寸。该   链接器将公共符号转换为a   声明,如果有定义   相同的变量。

(通过nm手册页找到。)之后在手册页本身中有更多信息。