[英]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部分的唯一两个属性是:
SHT_NOBITS
(即内存占用空间但存储空间不占用),在readelf
的输出中显示为NOBITS
。 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.