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部分的唯一两个属性是:
SHT_NOBITS(即,它占用内存空间但存储空间没有),它显示NOBITS在readelf输出中.PT_LOAD),可读(PF_R)和可写(PF_W)段.这样的段在存储上也比在内存(p_filesz< p_memsz)中更短.你可以有多个BSS部分:PowerPC的可执行文件可能有.sbss和.sbss2未初始化的数据变量.
最后,BSS部分不一定与数据部分或堆相邻.如果检查Linux内核(特别是load_elf_binary函数),可以看到BSS部分(或者更确切地说,它映射到的部分)甚至可以与代码和初始化数据交织.Linux内核设法对此进行排序.