ELF文件系列第二篇ELF文件静态结构中的文件头

ELF文件头表示

文件头中含有整个文件的结构信息,包括一些控制单元的大小。可以用以下这个数据结构体来描述文件头:

#define EI_NIDENT 16
typedef struct {
    unsigned char e_ident[EI_NIDENT];
    Elf32_Half e_type;
    Elf32_Half e_machine;
    Elf32_Word e_version;
    Elf32_Addr e_entry;
    Elf32_Off e_phoff;
    Elf32_Off e_shoff;
    Elf32_Word e_flags;
    Elf32_Half e_ehsize;
    Elf32_Half e_phentsize;
    Elf32_Half e_phnum;
    Elf32_Half e_shentsize;
    Elf32_Half e_shnum;
    Elf32_Half e_shstrndx;
} Elf32_Ehdr;
数据类型大小:
名字	      字节数	对齐字节数	目的
Elf32_Addr  	4	     4	        无符号地址
Elf32_Half	2	     2	        无符号半整型
Elf32_Off	4	     4	        无符号文件偏移量
Elf32_Sword	4	     4	        有符号整型
Elf32_Word	4	     4	        无符号整型
unsigned char   1            1	        无符号短整型

其中各个成员的意义如下:

e_ident

     开头这16个字节含有 ELF 文件的识别标志,并且提供了一些用于解码和解析文件内容的数据,是不依赖于操作系统的。

e_ident[]数组各个索引位置的含义
名字EI_MAG0EI_MAG1EI_MAG2EI_MAG3EI_CLASSEI_DATAEI_VERSIONEI_PADEI_NIDENT
0123456716
用途文件标志文件标志文件标志文件标志文件类别编码格式文件版本补齐字节开始位置e_ident[]数组的大小

      下面对这几个字段名字解释一下

 名字意义解释说明
EI_MAG0 ~ EI_MAG3ELFMAG00x7Fe_ident[EI_MAG0]文件的最前面 4 字节 e_ident[EI_MAG0] ~ e_ident[EI_MAG3]的内容被称为“魔数”,用于标识这是一个 ELF 文件。这四个字节存放的内容是固定的:
ELFMAG1‘E’e_ident[EI_MAG1]
ELFMAG2‘L’e_ident[EI_MAG2]
ELFMAG3‘F’e_ident[EI_MAG3]
EI_CLASSELFCLASSNONE0非法目标文件接下来的一个字节 e_ident[EI_CLASS]指明目标文件的类型,目前支持两种字长,32 位和 64 位。32 位字长的文件(ELFCLASS32)所支持的系统,其进程地址空间为 4G 字节,文件的最大容量也是 4G。64 位字长的文件(ELFCLASS64)格式定义目前还没有完成
ELFCLASS32132位目标文件
ELFCLASS64264位目标文件
EI_DATAELFDATANONE0非法编码格式指明了目标文件中的数据编码格式
ELFDATA2LSB1LSB编码(小端编码)
ELFDATA2MSB2MSB编码(大端编码)
EI_VERSIONEV_CURRENT1ELF 文件头的版本目前这个版本号是 EV_CURRENT,即“1”
EI_PAD~EI_NIDENT-1从 e_ident[EI_PAD]到 e_ident[EI_NIDENT-1]之间的 9 个字节目前暂时不使用,留作以后扩展,在实际的文件中应被填 0 补充,其它程序在读取 ELF 文件头时应该忽略这些字节。
举个栗子

e_type

       此字段表明本目标文件属于哪种类型,以下文件类型中,core 文件类型目前还不支持,但仍然为它保留了这一关键字。

名字

ET_NONE

ET_REL

ET_EXEC

ET_DYN

ET_CORE

ET_LOPROC

ET_HIPROC

0

1

2

3

4

0xff00

0xffff

意义

未知文件类型 

可重定位文件

可执行文件

动态链接库文件

Core文件

特定处理器文件扩展上/下边界

e_machine

      此字段用于指定该文件适用的处理器体系结构,下表列出了几个主要的,其它的没列。

名字

EM_NONE

EM_386

RESERVED

EM_ARM

0

3

11 ~ 16

40

意义

未知体系结构

Intel Architecture

保留未用

ARM/Thumb Architecture

     在 ELF 文件中,处理器厂商可以定义一些自有的常量,还可以定义一些自有的段名字,这类命名必须要遵守一定的规则。

e_version

       此字段指明目标文件的版本。EV_NONE表示非法版本号;EV_CURRENT表示当前版本号。EV_CURRENT 是一个动态的数字,表示最新的版本。

其他

e_entry
     此字段指明程序入口的虚拟地址。即当文件被加载到进程空间里后,入口程序在进程地址空间里的地址。对于可执行程序文件来说,当 ELF 文件完成加载之后,程序将从这里开始运行;而对于其它文件来说,这个值应该是 0。
e_phoff:此字段指明程序头表(program header table)开始处在文件中的偏移量。如果没
有程序头表,该值应设为 0。
e_shoff:此字段指明节头表(section header table)开始处在文件中的偏移量。如果没有节头表,该值应设为 0。
e_flags:此字段含有处理器特定的标志位。标志的名字符合”EF_machine_flag”的格式。对于 Intel 架构的处理器来说,它没有定义任何标志位,所以 e_flags 应该为0。
e_ehsize:此字段表明 ELF 文件头的大小,以字节为单位。
e_phentsize:此字段表明在程序头表中每一个表项的大小,以字节为单位。

e_phnum:
此字段表明程序头表中总共有多少个表项。如果一个目标文件中没有程序头
表,该值应设为 0。
e_phnum:此字段表明程序头表中总共有多少个表项。如果一个目标文件中没有程序头表,该值应设为 0。
e_shentsize:此字段表明在节头表中每一个表项的大小,以字节为单位。
e_shnum:此字段表明节头表中总共有多少个表项。如果一个目标文件中没有节头表,该值应设为 0。
e_shstrndx:节头表中与节名字表相对应的表项的索引。如果文件没有节名字表,此值应设置为 SHN_UNDEF。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ELF文件(Executable and Linkable Format,可执行和可链接格式)是一种能够在不同操作系统上共享和执行的二进制文件格式。ELF文件部和程序表是ELF文件的两个关键部分。 ELF文件部位于文件的开,包含了描述整个ELF文件的基本信息。具体包括标识字段、目标机器体系结构文件类型、入口点地址、程序表偏移地址等重要信息。标识字段用来识别文件ELF标志和版本。目标机器体系结构字段标识了目标操作系统的硬件要求,例如x86、ARM等。文件类型字段表示了ELF文件的类型,如可执行文件、共享目标文件、动态链接库等。入口点地址标识了程序运行的起始地址。程序表偏移地址则指向ELF文件的程序表的位置, 程序表包含了更加详细的段信息。 程序表位于ELF文件部之后,包含了多个描述ELF文件各个段(section)的表项。每个表项包含了段的类型、段在文件的偏移地址、内存的虚拟地址、段的大小等信息。段是ELF文件的基本组成单元,如代码段、数据段、bss段。这些段在ELF文件包含了可执行代码、全局变量、静态数据等。程序表通过这些表项的信息告诉操作系统如何加载和运行ELF文件。 通过解析ELF文件部和程序表,我们可以获取关于ELF文件的基本信息和段的详细信息。这些信息对于调试、加载、执行ELF文件都非常重要。因此,深入理解ELF文件部和程序表对于理解操作系统和二进制文件的运行机制具有重要意义。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值