ELF文件详解

目录

ELF文件类型

ELF Header

Sections

.text

.rodata

.data

.bss

.sysmtab

.debug

.line

.strtab

ESP:

Section Header Table

sh_type(节类型)

sh_flag(节标志位)

sh_link,sh_info(节链接信息)

Program Header Table

符号表

备注:


ELF文件类型

ELF是一种文件格式,全名为可执行和可链接格式(Executable and Linkable Format)。

ELF文件主要有以下三类:

  1. 可重定位文件(relocatable file) 它保存了一些可以和其他目标文件链接并生成可执行文件或者共享库的二进制代码和数据。一般为.o文件,静态链接库属于可重定位文件。
  2. 可执行文件(excutable file)它保存了适合直接加载到内存中执行的二进制程序。
  3. 共享库文件(shared object file)一种特殊的可重定位目标文件,可以在加载或者运行时被动态的加载进内存并链接。一般为.so文件。

有两种情况可以使用:

  1. 链接器将其与其他可重定位文件、共享目标文件链接成新的目标文件
  2. 动态连接器将其与其他共享目标文件,结合一个可执行文件,创建进程映像。

ELF文件主要由4部分组成:

  1. ELF Header
  2. ELF Program Header Table (或称Program Headers、程序头)
  3. ELF Section Header Table (或称Section Headers、节头表)
  4. ELF Sections

ELF Header

每个ELF文件都存在一个ELF Header用来描述其结构和组成。ELF Header对应的是一个结构体,结构体定义如下:

#define EI_NIDENT 16

typedef struct {                             
    unsigned char e_ident[EI_NIDENT];    //包含一个magic number、ABI信息,该文件使用的平台、大小端规则        
    uint16_t      e_type;                //文件类型,表示该文件属于可执行文件、可重定位文件、core dump文件或共享库    
    uint16_t      e_machine;             //机器类型,ELF文件的CPI平台属性    
    uint32_t      e_version;             //通常都是1    
    ElfN_Addr     e_entry;               //表示程序执行的入口地址    
    ElfN_Off      e_phoff;               //表示Program Header的入口偏移量(以字节为单位)    
    ElfN_Off      e_shoff;               //表示Section Header的入口偏移量(以字节为单位)    
    uint32_t      e_flags;               //保存了这个ELF文件相关的特定处理器的flag    
    uint16_t      e_ehsize;              //表示ELF Header大小(以字节为单位)    
    uint16_t      e_phentsize;           //表示Program Header大小(以字节为单位)   
    uint16_t      e_phnum;               //表示Program Header数量(十进制)   
    uint16_t      e_shentsize;           //表示Section Header大小(以字节为单位)    
    uint16_t      e_shnum;               //表示Section Header数量(十进制)    
    uint16_t      e_shstrndx;            //表示字符串表的索引,字符串表用来保存ELF文件中的字符串,如段名,变量名。然后通过字符串在表中的偏移访问字符串
}ElfN_Ehdr;

ElfN_Addr    Unsigned program address,uintN_t
ElfN_OFF     Unsigned file offset,uintN_t

可以使用readelf工具来查看ELF Header

$ readelf -h hello.o 
ELF Header: 
  Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 
  Class:                             ELF64 
  Data:                              2's complement, little endian 
  Version:                           1 (current) 
  OS/ABI:                            UNIX - System V 
  ABI Version:                       0 
  Type:                              REL (Relocatable file) 
  Machine:                           Advanced Micro Devices X86-64 
  Version:                           0x1 
  Entry point address:               0x0 
  Start of program headers:          0 (bytes into file) 
  Start of section headers:          792 (bytes into file) 
  Flags:                    
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ELF (Executable and Linkable Format)是一种用于存储可执行文件、目标文件和共享库的文件格式。它是Linux系统上常用的二进制文件格式之一,也是其他类UNIX系统所采用的标准格式。 ELF文件格式由三个主要部分组成:头部、段表和节表。 头部包含了一些重要的信息,如文件类型、系统架构、入口地址等。它还包含了段表和节表的偏移地址和大小等信息,以便系统可以正确解析文件。 段表记录了程序的运行时需要的各种段的信息。一个段可以是代码段、数据段、动态链接信息段等。每个段都有自己的虚拟地址和大小等属性。段表中的每个条目描述了一个段的属性和位置,用于程序的加载和运行。 节表类似于段表,不过节表记录了程序的编译时需要的各种节的信息。一个节可以是代码节、数据节、符号表等。每个节都有自己的虚拟地址和大小等属性。与段表类似,节表中的每个条目描述了一个节的属性和位置,用于编译、链接和调试。 ELF文件格式的优点是它的灵活性和可扩展性。由于ELF文件规范定义了头部、段表和节表等结构,因此可以通过添加新的段或节来实现文件的自定义属性和功能。这使得ELF文件格式非常适合于Linux系统的动态链接和加载机制。 总的来说,ELF文件格式是一种Linux系统中常用的二进制文件格式,它定义了文件的结构和属性,包括头部、段表和节表等部分。通过这个格式,可以实现文件的加载、链接和调试等功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值