如果我理解正确,通过创建.bss
类型的部分(如下面的代码示例),.bss
部分的写/读区域来自文件中的部分偏移量N
并且在这种情况下phdr.p_memsz
增加N
个字节,并且操作系统/内核为零,该内存区域为零。我的解释是对的吗?
Elf32_Phdr phdr;
// ...
phdr.p_memsiz = somevalue;
Elf32_Shdr sec;
// ...
sec.sh_name = bss_name;
sec.sh_type = SHT_nobits;
sec.sh_flags = SHF_alloc + SHF_write;
sec.sh_size = N;
phdr.p_memsiz += N;
答案 0 :(得分:2)
是的,操作系统会用零填充.bss部分。
一般来说,Linux(以及其他版本的Unix)无论如何都会将流程中的所有“新”页面归零,以避免从“以前的所有者”泄露内容(想想它就像粉碎你的回收)。
编辑:
不可思议的是,链接器和加载器负责.bss部分的实际位置。通常,它位于数据部分的末尾,如ELF规范1.2,图2.5中所述。
正如“章节”所述,.bss部分的类型为
SHT_NOBITS
。 虽然它在文件中不占用空间,但它有助于实现 段的记忆图像。通常,这些未初始化的数据驻留在 细分的结尾,从而使p_memsz
大于p_filesz
。
(在其他地方,它解释说内容保证为零)
您可以在此处找到规范(以及许多其他地方,但此网站也有一些有用的扩展文档等) http://refspecs.linuxbase.org/
LLVM源代码和相关文档也相当可读(IMO): http://llvm.org/docs/doxygen/html/Support_2ELF_8h_source.html
有关如何指定链接和订单,部分位置的信息: http://www.math.utah.edu/docs/info/ld_3.html