全局变量和静态变量存储在哪个内存段?

3
在我的链接脚本中,起始地址和大小如下所示:
code start:90400000
code end:  90a00000
data start:90b00000, size 3MB
bss start: 91200000, size 1MB

但是当我声明一个全局变量时,它的地址是:910bead0。它应该存在于.bss段中,但它在其他地方,而我甚至没有在链接器脚本中指定它。有没有人能告诉我发生了什么?


2
在链接期间生成地图文件。 - Martin James
注意:0x910bead0 - 0x90b00000 == 0x5BEAD0 == 6023888,大约为6MB。 - Matthieu M.
1个回答

3
您没有说明使用的是哪个系统等信息,但传统上:初始化的全局数据放在data中;未初始化的全局数据放在bss中(将被初始化为0)。当您编写以下内容时:
int x = 0;

不同的系统有所不同:一些系统认为初始化等同于零初始化(即没有指定初始化时发生的情况),并将其放在bss中;而其他系统则只是看到有初始化,就将其放在data中。


你没有指明你使用的是什么系统等信息。 在使用CodeSourcery创建Cortex A15上的ELF文件时,我知道关于内存分段的事情,但是正如你所见,该地址既不驻留在数据区也不在bss区。 - ritesh
@ritesh 如果数据大小超出了你给定的大小,链接器会怎么做?例如,如果它需要放置超过3MB的数据段呢? - James Kanze
大小为3MB并非硬编码,而是动态的,在链接器中我包含了所有输入的.data文件,并从中计算出大小。也就是说,一旦数据大小被计算出来,它怎么可能会改变呢? - ritesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接