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:                             0x0 
  Size of this header:               64 (bytes) 
  Size
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值