当前位置: 首页 > news >正文

ELF文件结构

在这里插入图片描述
  ELF文件格式的最前部是 ELF文件头(ELF Header) ,包含整个文件的基本属性。然后是各个,ELF文件中与节有关的结构是 “节表(Section Header Table)”,节表描述ELF文件包含的所有节的信息。

文件头

elf.h中的自定义类型

自定义类型描述原始类型长度(字节)
Elf32_Addr32位版本程序地址uint32_t4
Elf32_Half32位版本的uint16_t2
Elf32_Off32位版本的偏移地址uint32_t4
Elf32_Sword32位版本有符号整型int32_t4
Elf32_Word32位版本无符号整型uint32_t4
Elf64_Addr64位版本程序地址uint64_t8
Elf64_Half64位版本无符号整型uint16_t2
Elf64_Off64位版本的偏移地址uint648
Elf64_Sword64位版本有符号整型int32_t4
Elf64_Word64位版本无符号整型uint32_t4

32位版本的文件头结构定义如下

#define EI_NIDENT 16struct Elf32_Ehdr            //共52个字节    //Ehdr表示ELF header
{unsigned char  e_ident[EI_NIDENT];Elf32_Half e_type;        //类型包括:可执行文件、可重定向文件、共享目标文件等Elf32_Half e_machine;     //有X86、arm之类Elf32_Word e_version;Elf32_Addr e_entry;       //可执行程序的入口地址Elf32_Off e_phoff;        //Program头表的偏移地址Elf32_Off e_shoff;        //Section头表的偏移地址Elf32_Word e_flags;Elf32_Half e_ehsize;      //本结构体的sizeElf32_Half e_phentsize;   //单个Program头的sizeElf32_Half e_phnum;       //Segment头表中Segment头的个数Elf32_Half e_shentsize;   //单个Section头的szieElf32_Half e_shnum;       //Section头表中Section头的个数Elf32_Half e_shstrndx;    //储存Section名字集合的Section的下标,指".shstrtab"的下标
};

节表

节表是保存节的基本属性的结构。

struct Elf32_Shdr              //共40个字节    //Shdl表示Section header
{Elf32_Word sh_name;        //所指向Section的名字,如".text"、".data"、".bss"等Elf32_Word sh_type;        //所指向Section的类型,如:符号表、字符串表等Elf32_Word sh_flags;       Elf32_Addr sh_addr;Elf32_Off sh_offset;       //所指向Section在ELF文件中的偏移量Elf32_Word sh_size;        //所指向Section的sizeElf32_Word sh_link;        //和其关联的Section头的下标索引Elf32_Word sh_info;Elf32_Word sh_addralign;   //字节对齐Elf32_Word sh_entsize;
};

节的类型(sh_type)
节的类型相关常量以SHT_开头

常量含义
SHT_NULL0无效段
SHT_PROGBITS1程序段。代码段、数据段都是这种类型的
SHT_SYMTAB2表示该段的内容为符号表
SHT_STRTAB3表示该段内容为字符串表
SHT_RELA4重定位表。包含重定位信息
SHT_HASH5符号表的哈希表
SHT_DYNAMIC6动态链接信息
SHT_NOTE7提示性信息
SHT_NOBITS8表示该段在文本中没内容
SHT_REL9包含重定位信息
SHT_SHLIB10保留
SHT_DNYSYM11动态链接

节的标志位(sh_flag)
标志位表示段在进程虚拟地址空间中的属性。

常量含义
SHF_WRITE1可写
SHF_ALLOC2该节在进程空间需要分配空间
SHF_EXECINSTR4该节在进程空间中可以执行

重定位表

  链接器在处理目标文件时,需要对目标文件中某些部位进行重定位,即代码段和数据段哪些对绝对地址的引用的位置。
  一个重定位表同时也是ELF的一个段,这个段的类型就是“SHT_REL”。

字符串表

  字符串长度往往是不定的,将字符串集中起来存放到一个表,然后使用字符串在表中的偏移来引用字符串。
  这种方式,在ELF文件中引用字符串只需要给出一个数字下标最为偏移即可。
  一般字符串表在ELF文件中也以段的形式保存,常见的段名为“.strtab”或“.shstrtab”。这两个字符串表分别为字符串表(String Table)和段表字符串表(Section Header String Table)。
  在ELF文件头中有一个字段e_shstrndx,它是 “Section header string table index” 的缩写,是段表字符串表在段表中的索引下标。


http://www.mrgr.cn/news/31409.html

相关文章:

  • ESLint 使用教程(四):ESLint 有哪些执行时机?
  • 接口类和抽象类在设计模式中的一些应用
  • 【LeetCode】【算法】11. 盛最多水的容器
  • hive的tblproperties支持修改的属性
  • 丹摩征文活动|Faster-Rcnn-训练与测试详细教程
  • 【Xrdp联机Ubuntu20.04实用知识点补充】
  • LeetCode337. 打家劫舍III
  • 【千帆AppBuilder】零代码+组件+代码节点方式实现AI应用《法定退休年龄计算器》
  • ArrayList和Array有什么区别?
  • 算法课习题汇总(2)
  • Data Lakehouse如何使用
  • BUUCTF-MISC-隐藏的钥匙
  • 三 auto占位符
  • Vue3中el-table组件实现分页,多选以及回显
  • 【Redis入门到精通三】Redis核心数据类型(List,Set)详解
  • 【Linux】进程概念
  • Zookeeper安装使用教程
  • JAVA8新特性——Optional
  • uboot:源码分析-启动第一阶段-start.S解析
  • IPD流程体系:IPD在硬件产品开发中的应用
  • NCNN 学习(2)-Mat
  • 嵌入式linux系统中rk3588芯片引脚基本操作
  • 基于SpringBoot的旅游管理系统
  • Linux:Bash中的文件描述符
  • Ansbile-变量
  • 【云网络】软件定义网络SDN的概念与应用(以PVE8用户隔离,TLS证书介绍,自签证书等为例)