这些天,我指的是Linux中的文件处理系统调用。
此外,我理解ELF是可执行和可链接的格式,包含一组部分。
那些是.bss , .data , .rodata , .text , .comment和unknown
我提到了维基百科和这个网站去学习
所以我有下面的问题
为什么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
部分。