@xiaohaizi
2023-03-06T08:41:42.000000Z
字数 3319
阅读 206
GNU
本章描述了目标文件格式—— ELF(Executable and Linking Format)。有3种类型的目标文件:
可重定位文件(relocatable file):包含指令和数据,这些代码和数据适合与其他目标文件链接,以创建可执行文件或共享目标文件。
可执行文件(executable file):包含适合被执行的程序。
共享目标文件(shared object file):包含指令和数据,这些代码和数据适合在两个上下文中链接:
1.(编译过程) link editor将它和其他的可重定位文件以及共享目标文件来创建另一个目标文件。
2.(动态加载过程) 动态链接器将它和可执行文件以及其他共享目标文件合并来创建一个进程image。
有汇编器和link editor创建的目标文件直接在CPU上执行的程序的二进制表示。
目标文件参与:
- 程序链接(构建一个程序)
- 程序执行(运行一个程序)
ELF头(ELF Header):在文件的开头,包含描述文件组织的“路线图”。
节(Section):包含了从链接视角出发的大量信息:指令、数据、符号表,重定位信息等等。
段(Segment):主要用于执行视角。
程序头表(Program Header Table):如果存在的话,说明了如何构建进程image。用于构建进程image的文件必须包含程序头表;可冲定位文件不需要。
节头表(Section Header Table):包含节的描述信息,每个Section都有在这个表中有一个Entry。链接期间用到的文件必须包含一个节头表,其他文件可能有也可能没有。
小贴士:
尽管图中显示了ELF Header后边紧接着Program Header Table,而且Section Header Table被放在多个Section的后面,实际上可能不这么放。此外,节和段没有特定的顺序。只有ELF Header在文件中有固定的位置。
目标文件格式支持各种处理器架构,从8位到32位都支持。因此,目标文件以一种独立于机器的格式表示控制数据,使得以一种通用的方式识别目标文件并解释其内容成为可能。目标文件的剩余数据使用目标处理器的编码,而不管文件是在什么机器上创建的。
目标文件定义的所有数据结构“自然”大小和对其准则。
各字段含义:
e_ident:这16个字节将该文件标记为目标文件,并提供独立于机器的数据来解码和解释文件的内容。
e_type:定义了目标文件的类型。
core file的内容尚未被指定。
从ET_LOPROC到ET_HIPROC的类型是处理器相关的。
剩下尚未使用的类型是保留的。
e_machine:制定了处理器架构。
其他值保留,用于分配给新机器。
e_version:目标文件的版本。
值1表示原始最初的文件格式;扩展将创建具有更大数字的新版本。尽管上边给出的EV_CURRENT为1,但在有必要时改变以反应当前的版本号。
e_entry:给出一个虚拟地址,系统将控制权先跳转到该虚拟地址。
e_phoff:Program header Table在目标文件中的Offset(单位为字节)。如果文件没有Program header Table,则该值为0。
e_shoff:Section header Table在目标文件中的Offset(单位为字节)。如果文件没有Section header Table,则该值为0。
e_flags:持有与文件相关的处理器标志。标志名称从EF_machine_flag中取。
e_ehsize:ELF header的大小。
e_phentsize:Program header Table的一个Entry的大小。所有Entry大小相同。
e_phnum:Program header Table中Entry的数量。e_phentsize和e_phnum的乘积就是整个Program header Table的大小。若没有Program header Table,e_phnum=0。
e_shentsize:Section header Table的一个Entry的大小。所有Entry大小相同。
e_shnum:Section header Table中Entry的数量。e_shentsize和e_shnum的乘积就是整个Section header Table的大小。若没有Section header Table,e_phnum=0。
e_shstrndx:
ELF提供了一个目标文件框架,来支持多处理器,多数据编码,以及多类机器。为实现这个目标文件族,ELF文件的初始字节指定了如何解释文件。
其中:
EI_MAG0 到 EI_MAG3:是一个4字节“魔数”,标记着这是一个ELF文件。
EI_CLASS:标记文件类型,或者capacity。
EI_DATA:指定处理器相关的数据编码。
大端法和小端法:
EI_VERSION:ELF header version number。
当前,它的值必须是EV_CURRENT。
EI_PAD:填充。
目标文件的Section header Table可以让我们定位该目标文件中的所有节。
Section header Table是一个 Elf32_Shdr结构的数组。
部分Section header Table的下标被保留;目标文件没有这些特殊下标部分:
SHN_UNDEF:标记一个未定义的、缺失的、不相关的或者无意义的节引用。比方说,a symbol "defined'' relative to
section number SHN_UNDEF is an undefined symbol.
SHN_LORESERVE:
SHN_LOPROC
目标文件的节满足几个条件:
一个section header 具有如下所示的结构:
sh_type指明了section的语义。