众所周知,.bss部分未存储在磁盘中,但内存中的.bss部分应初始化为零。但它应该在记忆中的哪个位置?是否有任何信息显示在ELF标题中或者.bss部分可能出现在数据部分旁边,还是其他什么?
答案 0 :(得分:15)
BSS位于数据和堆之间,详见this marvelous article。
您可以使用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部分的唯一两个属性是:
SHT_NOBITS
(即内存占用空间,但存储空间无空间),在NOBITS
的输出中显示为readelf
。PT_LOAD
),可读(PF_R
)和可写(PF_W
)段。这样的段在存储上也比在内存中更短(p_filesz
< p_memsz
)。您可以拥有多个BSS部分:PowerPC可执行文件可能包含.sbss
和.sbss2
未初始化的数据变量。
最后,BSS部分不一定与数据部分或堆相邻。如果您检查Linux kernel(更多特别是load_elf_binary
函数),您可以看到BSS部分(或更确切地说,它映射到的segment)甚至可能与代码交错初始化数据。 Linux内核设法对其进行排序。