我对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会发生什么?
答案 0 :(得分:1)
它进入了“共同部分”。您可以使用objdump -t
或使用nm
来查看。
我不太清楚我明白这是什么意思,但对ld
-warn-common
标志的引用说明了这一点:
int i;
一个常见的符号。如果只有 (一个或多个)a的常用符号 变量,它是未初始化的 输出文件的数据区域。该 链接器合并多个公共符号 将同一变量合并为一个 符号。如果他们是不同的 尺寸,它选择最大的尺寸。该 链接器将公共符号转换为a 声明,如果有定义 相同的变量。
(通过nm
手册页找到。)之后在手册页本身中有更多信息。