elf文件中.bss节空间的地址空间

时间:2014-04-04 06:37:59

标签: c++ storage elf segment sections

如果我理解正确,通过创建.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;

1 个答案:

答案 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