ELF文件的.bss部分应该在哪里占用内存?

时间:2012-05-02 09:12:08

标签: c linux memory elf

众所周知,.bss部分未存储在磁盘中,但内存中的.bss部分应初始化为零。但它应该在记忆中的哪个位置?是否有任何信息显示在ELF标题中或者.bss部分可能出现在数据部分旁边,还是其他什么?

2 个答案:

答案 0 :(得分:15)

BSS位于数据和堆之间,详见this marvelous article

enter image description here

您可以使用size找出每个部分的大小:

cnicutar@lemon:~$ size try
   text    data     bss     dec     hex filename
   1108     496      16    1620     654 try

答案 1 :(得分:10)

要知道bss段在内存中的位置,只需运行readelf -S program,然后检查.bss行上的 Addr 列即可。

在大多数情况下,您还会看到之前的初始化数据部分(.data)。也就是说,您会看到.data部分的地址+尺寸.bss部分的起始地址相匹配。

然而,并非总是如此。这些是历史惯例,ELF specification(与平台特定补充一起阅读,例如涵盖32-bit x86 machines的第5章)允许更复杂的配置,并非所有配置都受支持通过Linux。

例如,该部分可能根本不会被称为.bss。制作BSS部分的唯一两个属性是:

  1. 该部分标有SHT_NOBITS(即内存占用空间,但存储空间无空间),在NOBITS的输出中显示为readelf
  2. 它映射到可加载(PT_LOAD),可读(PF_R)和可写(PF_W)段。这样的段在存储上也比在内存中更短(p_filesz< p_memsz)。
  3. 您可以拥有多个BSS部分:PowerPC可执行文件可能包含.sbss.sbss2未初始化的数据变量。

    最后,BSS部分不一定与数据部分或堆相邻。如果您检查Linux kernel(更多特别是load_elf_binary函数),您可以看到BSS部分(或更确切地说,它映射到的segment)甚至可能与代码交错初始化数据。 Linux内核设法对其进行排序。