当前位置: 首页 > 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” 的缩写,是段表字符串表在段表中的索引下标。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Git入门学习(1)
  • 基于协同过滤算法+PHP的新闻推荐系统
  • 详解Linux中cat命令
  • linux-安全管理-防火墙与网络安全
  • 硬件工程师笔试面试——开关
  • 【网络安全的神秘世界】攻防环境搭建及漏洞原理学习
  • 每日奇难怪题(持续更新)
  • Ceph 基本架构(一)
  • 用Go语言构建健壮的并发系统:深入理解错误传播与处理
  • oracle表的类型
  • 变量的作用域和生命周期
  • 定义可引用的 CI/CD 配置文件中的输入参数
  • JavaSE--集合总览02:单列集合Collection的体系之一:List
  • CLI示例(V2R8至V2R19C00版本):直连二层组网直接转发【AP+上层网络,增加AP下行口有线接入】
  • MyBatis 基本操作 - XML版
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • crontab执行失败的多种原因
  • HTTP中GET与POST的区别 99%的错误认识
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • Js基础——数据类型之Null和Undefined
  • ReactNative开发常用的三方模块
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • Service Worker
  • 利用jquery编写加法运算验证码
  • 强力优化Rancher k8s中国区的使用体验
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 微信小程序:实现悬浮返回和分享按钮
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • ​14:00面试,14:06就出来了,问的问题有点变态。。。
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • # AI产品经理的自我修养:既懂用户,更懂技术!
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • (2024最新)CentOS 7上在线安装MySQL 5.7|喂饭级教程
  • (AngularJS)Angular 控制器之间通信初探
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (苍穹外卖)day03菜品管理
  • (二)PySpark3:SparkSQL编程
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (离散数学)逻辑连接词
  • (四)鸿鹄云架构一服务注册中心
  • (一) storm的集群安装与配置
  • (一)SvelteKit教程:hello world
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • (原創) 物件導向與老子思想 (OO)
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • ******之网络***——物理***
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • .Net8 Blazor 尝鲜
  • .NET开发人员必知的八个网站
  • .net之微信企业号开发(一) 所使用的环境与工具以及准备工作
  • :如何用SQL脚本保存存储过程返回的结果集
  • @data注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)