为什么可执行文件和可链接格式(ELF)文件包含一组节?

这些天,我指的是Linux中的文件处理系统调用。

此外,我理解ELF是可执行和可链接的格式,包含一组部分。

那些是.bss.data.rodata.text.commentunknown

我提到了维基百科和这个网站去学习

所以我有下面的问题

为什么ELF文件使用一组部分?

每个部分的任务是什么?

这套使用的部分有什么可行性?

对于ELF文件格式的一个很好的参考是System V ABI的Object Files章节 。 特别的是, 特别的部分描述了你可能遇到的大多数部分的用途。

为什么ELF文件使用一组部分?

一个目标文件包含许多不同类别的数据,将类似的数据分组为部分是有意义的,特别是当操作系统执行ELF文件时,某些部分的内容可以直接读入进程的映像。

  • .bss包含未初始化的数据,如int a; 在C程序中在全球范围内声明。 实际上,除了在将ELF文件加载到进程中时需要分配的大小之外,它什么也不包含,因为bss中的所有变量都被初始化为0。
  • .data包含初始化数据,如int a = 1000; 在C程序中在全球范围内声明。
  • .rodata包含只读数据,例如字符串文字和全局级别变量,声明为C中的const 。当操作系统执行ELF文件时,它会将此部分加载到只读内存区域。
  • .text包含可执行的指令。 当操作系统执行ELF文件时,它将把这部分加载到只读的内存区域。 有时.text.rodata被加载到进程内存的同一区域。
  • .comment通常包含用于生成文件的编译器的名称和版本。

并非所有文档中描述的部分都可能出现在所有ELF文件中; 特别是在ELF文件上运行strip命令将删除.symtab.debug部分。