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

ven*_*s.w 8 c linux memory elf

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

cni*_*tar 15

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

在此输入图像描述

您可以使用以下方法查找每个部分的大小size:

cnicutar@lemon:~$ size try
   text    data     bss     dec     hex filename
   1108     496      16    1620     654 try
Run Code Online (Sandbox Code Playgroud)


Squ*_*ree 10

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

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

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

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

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

你可以有多个BSS部分:PowerPC的可执行文件可能有.sbss.sbss2未初始化的数据变量.

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