ELF格式大致描述

本文介绍了ELF格式,包括四种类型:重定位文件、可执行文件、共享目标文件和核心转储文件。ELF文件由ELF头、程序头表、节和节头表组成。ELF头提供文件组织信息,程序头表描述段的内存布局,节和段则是程序的组成部分。通过readelf工具可以查看ELF头、程序头表和节头表的详细信息。
摘要由CSDN通过智能技术生成

ELF格式

ELF文件类型

  ELF是一种用于二进制文件、可执行文件、目标代码、共享库和核心转储格式文件的文件格式。是Linux上二进制文件的标准格式。
  ELF有四种类型:

  • 重定位文件( ET_REL ),也就是常称的目标文件
  • 可执行文件( ET_EXEC )
  • 共享目标文件( ET_DYN ),即共享对象文件、动态库文件
  • 核心转储文件( ET_CORE )

除此之外还会有类型不确定的ELF文件( ET_NONE ),即未知文件。

ELF文件结构

  ELF由四部分组成:ELF头( ELF header )、程序头表( Program header table )、节( section )、节头表( section header table ),大致结构如下图所示:
在这里插入图片描述
需要注意的是,ELF文件结构的排布并不一定如上图所示,而且也不一定包含上图的所有内容。但是,ELF头一定会有,且在整个文件的第一个部分。
  这篇笔记下面就是解释这张图中的信息。

ELF header

  ELF头就是一个结构体,被称为 struct ElfN_Ehdr (程序头、节头都是结构体,在图中已经标出了对应结构体的名称)。该结构主要描述了整个文件的组织,前面提到ELF头以外的内容没有固定的位置是因为它们的位置是由ELF头指出的。
  ELF头对应的结构体如下(32位)

#define EI_NIDENT (16)
typedef struct
{
   
  unsigned char e_ident[EI_NIDENT];   /* Magic number and other info */
  Elf32_Half    e_type;               /* Object file type */
  Elf32_Half    e_machine;            /* Architecture */
  Elf32_Word    e_version;            /* Object file version */
  Elf32_Addr    e_entry;              /* Entry point virtual address */
  Elf32_Off     e_phoff;              /* Program header table file offset */
  Elf32_Off     e_shoff;              /* Section header table file offset */
  Elf32_Word    e_flags;              /* Processor-specific flags */
  Elf32_Half    e_ehsize;             /* ELF header size in bytes */
  Elf32_Half    e_phentsize;          /* Program header table entry size */
  Elf32_Half    e_phnum;              /* Program header table entry count */
  Elf32_Half    e_shentsize;          /* Section header table entry size */
  Elf32_Half    e_shnum;              /* Section header table entry count */
  Elf32_Half    e_shstrndx;           /* Section header string table index */
} Elf32_Ehdr;

  命令readelf -h可以查看ELF文件的ELF头信息:

#注释:hello是一个打印helloworld的可执行程序,该程序是64位的
$ readelf -h hello
ELF 头:
  Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 
  类别:       
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值