繁体   English   中英

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

[英]where should the .bss section of ELF file take in memory?

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

BSS位于数据和堆之间,详见这篇了不起的文章

在此输入图像描述

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

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

要知道bss段在内存中的位置,运行readelf -S program就足够了,并检查.bss行上的Addr列。

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

但是,并非总是如此。 这些是历史惯例, ELF规范 (与平台特定的补充一起阅读,例如在覆盖32位x86机器的第5章中)允许更复杂的配置,并且并非所有这些都受Linux支持。

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

  1. 该部分标有SHT_NOBITS (即内存占用空间但存储空间不占用),在readelf的输出中显示为NOBITS
  2. 它映射到可加载( PT_LOAD ),可读( PF_R )和可写( PF_W )段。 这样的段在存储上也比在内存中短( p_filesz < p_memsz )。

您可以拥有多个BSS部分:PowerPC可执行文件可能具有.sbss.sbss2用于未初始化的数据变量。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM