一、ELF文件格式概述

1. ELF:是一种对象文件的格式,用于定义不同类型的对象文件中都放了什么东西、以及都以什么样的格式去放这些东西。

二、分析一个ELF文件

以一个最简单的helloworld程序为例

1. ELF文件头

使用工具查看ELF文件头:readelf -h obj

在/usr/include/elf.h中可以找到文件头结构定义:

大小总共为64字节,换算成十六进制为0x40。在十六进制代码中找到前0x40字节,即为文件头信息部分(阅读时注意反序问题):

(1)identification

第一部分:占四个字节。7f 45 4c 46,对应ASCII码.ELF,表示这是一个ELF对象。

第二部分:占一个字节。02表示是一个64位对象。

第三部分:占一个字节。01表示是小端表示法。

第四部分:占一个字节。01表示文件头版本。

其余默认为0。

(2)information

e_type:两个字节,01 00表示是一个重定位文件。

e_machine:两个字节,3e 00表示是intel80386处理器体系结构。

e_version:四个字节,01 00 00 00表示是当前版本。

e_entry:八个字节,00 00 00 00 00 00 00 00表示当前程序没有入口点。

e_phoff:八个字节,00 00 00 00 00 00 00 00表示没有程序头表。

e_shoff:八个字节,90 02 00 00 00 00 00 00表示段表的偏移地址在00 00 00 00 00 00 02 90处。

e_flags:四个字节,00 00 00 00表示未知处理器特定标志#define EF_SH_UNKNOWN 0x0。

e_ehsize:两个字节,40 00表示elf文件头大小为00 40(64个字节)。

e_phentsize:两个字节,00 00表示重定位文件没有程序头表。

e_phnum:两个字节,00 00表示重定位文件没有程序头表。

e_ehentsize:两个字节,40 00 表示段头大小为00 40(64字节),section header table中每个header的大小。

e_shnum:两个字节,0d 00表示段表入口有13个,即段表有13段。

e_shstrndx:两个字节,0a 00 表示段表字符串在段表中的索引号,.shstrab段的段表索引号为00 0a,即10。

2. 通过文件头找到各个节

使用工具查看段表信息:readelf -S obj

(1)找到段表

在文件头中e_shoff可以找到段表偏移地址00 00 00 00 00 00 02 90,从这个地址去查找段表。

段表长度由e_ehentsize为00 40(64字节)。

段表个数由e_shnum可知有13个。

/usr/include/elf.h中可以找到段表结构:

(2)分析一个段表

第一个段:全为零,不表示任何段。

第二个段:

sh_name:四个字节,20 00 00 00表示该段名称在.shstrtab中偏移量,为.test节。

sh_type:四个字节,01 00 00 00表示这个段拥有程序所定义的信息,其格式和含义完全由该程序确定,这里表示PROGBITS。

sh_flags:八个字节,06 00 00 00 00 00 00 00表示alloc和execute。

sh_addr:八个字节,00 00 00 00 00 00 00 00表示是section在内存中的虚拟地址,.o文件不需要执行,这里都是0。

sh_offset:八个字节,40 00 00 00 00 00 00 00表示是section与文件头之间的偏移。

sh_size:八个字节,11 00 00 00 00 00 00 00表示文件里面section占用的大小。

sh_link:四个字节,00 00 00 00表示没有链接信息。

sh_info:四个字节,00 00 00 00表示没有辅助信息。

sh_addralign:八个字节,01 00 00 00 00 00 00 00表示字节对齐长度。

sh_entsize:八个字节,00 00 00 00 00 00 00 00表示没有入口。(3)所有段表

第三个段:

段名:.rel.text

类型:RELA

标志:info

相对文件头偏移:0x1e0

占用大小:0x30

第四个段:

段名:.data

类型:PROGBITS

标志:write、alloc

相对文件头偏移:0x51

占用大小:0

第五个段:

段名:.bss

类型:NOBITS

标志:write、alloc

相对文件头偏移:0x51

占用大小:0

第六个段:

段名:.rodata

类型:PROGBITS

标志:alloc

相对文件头偏移:0x51

占用大小:0x0b

第七个段:

段名:.comment

类型:PROGBITS

标志:merge、strings

相对文件头偏移:0x5c

占用大小:0x26

第八个段:

段名:.note.GNU-stack

类型:PROGBITS

标志:无

相对文件头偏移:0x82

占用大小:0

第九个段:

段名:.eh_frame

类型:PROGBITS

标志:alloc

相对文件头偏移:0x88

占用大小:0x38

第十个段:

段名:.rela.eh_frame

类型:RELA

标志:info

相对文件头偏移:0x210

占用大小:0x18

第十一段:

段名:.shstrtab

类型:STRTAB

标志:无

相对文件头偏移:0x228

占用大小:0x61

第十二段:

段名:.symtab

类型:STRTAB

标志:无

相对文件头偏移:0xc0

占用大小:0x0108

第十三段:

段名:.strtab

类型:STRTAB

标志:无

相对文件头偏移:0x1c8

占用大小:0x11

三、理解常见节

1. .text节:本节中是可执行指令的集合

通过刚才的信息,我们可以从文件中偏移0x40处找到大小为0x11的 .text节:

可以通过反汇编该程序来查看:

2. .rodata:本节是只读数据,ro代表read only

从偏移0x51处找到大小为0x0b的 .rodata节:

使用ASCII码对照表翻译数据为hello 5309,即.c文件中的字符串:

2. .comment:本节用来存放编译器版本信息

从偏移0x5c处找到大小为0x26的 .comment节:

3. .symtab:本节存放所有section中定义的符号名字,一般是变量、函数shstrtab及symtab经常引用strtab中的字符串

从偏移0xc0处找到大小为0x0108的 .symtab节:

4. .strtab:本节是段表的字符串表

从偏移0x1c8处找到大小为0x11的 .strtab节:

数据用“0”分隔出了三部分,用ASCII码翻译:

65 6c 66 2e 63:elf.c

6d 61 69 6e:main

70 75 74 73:puts

linux elf文件格式相关推荐

  1. Linux ELF文件格式介绍

    文章目录 一.引言 二.介绍 三.ELF目标文件格式 3.1 常见段及对应用途 3.2 目标文件内容解析 3.2.1 代码段.text 3.2.2 只读数据段.rodata 3.2.3 数据段.dat ...

  2. linux ELF文件格式分析

    一.ELF文件格式概述 1. ELF:是一种对象文件的格式,用于定义不同类型的对象文件中都放了什么东西.以及都以什么样的格式去放这些东西. 二.分析一个ELF文件 以一个最简单的helloworld程 ...

  3. linux 文件格式elf,linux ELF 文件格式 | ZION

    ELF 文件类型 ELF (Executable Linkable Format) 是linux下的可执行文件格式,与windows下的PE (Portable Executable) 格式一样,都是 ...

  4. linux分析文件格式,linux elf文件格式分析

    #include void main() { printf("hello,jinxin!"); } 然后执行: gcc -o jin jin.c readelf -a jin EL ...

  5. linux的静态编译elf无法调试,[翻译]自己动手编写一个Linux调试器系列之4 ELF文件格式与DWARF调试格式 by lantie@15PB...

    自己动手编写一个Linux调试器系列之4 ELF文件格式与DWARF调试格式 by lantie@15PB 在上一节中,你已经听说了DWARF调试格式,它是程序的调试信息,是一种可以更好理解源码的方式 ...

  6. Linux内存管理:ELF文件格式

    Linux内存管理:ELF文件格式 rtoax 2021年3月 1. ELF文件格式 ELF (Executable and Linkable Format)是一种为可执行文件,目标文件,共享链接库和 ...

  7. Linux中GCC编译工具集中个软件的用途、gcc的简单编译以及ELF文件格式

    文章目录 一.gcc编译工具集中各软件的用途 1.1 GCC 1.2 Binutils 1.3 C运行库 二.简单编译 2.1 代码编译过程 2.2 多个程序文件的编译 2.3 检错 2.4 库文件连 ...

  8. linux 程序怎么执行文件格式,linux汇编之——(1)ELF:Linux可执行程序文件格式

    Windows的应用程序的格式是PE格式文件,LINUX的是ELF("Executable and Linking Format")文件格式. 一个手工打造的ELF文件,代码如下: ...

  9. Linux里gcc编译过程分析和ELF文件格式学习

    GCC编译器背后的故事及常用命令.了解ELF文件格式 前言 一.GCC简介 二.GCC背后的战友 1.Binutils 2.C运行库 三.GCC编译流程及对应命令 1.编译流程图及命令框图 2.实践操 ...

最新文章

  1. 如何现在就用到 Ubuntu 21.10
  2. 浪潮英特尔在德国发布KEEP升级计划 用户可提前体验英特尔KNM
  3. c++ 低位在前 高位在后_生意社:醋酸市场前三季度区间震荡 四季度一飞冲天
  4. 中国江苏省动漫产业发展导向及运营前景规划咨询报告2021-2027年
  5. 一步步在SAP Cloud Platform上创建HANA实例并使用
  6. [前台]---关于input标签的value值
  7. Java大牛的一些总结,献给对未来还在迷茫中的你!
  8. Code::Blocks 16.01 改变注释的的颜色
  9. 视频帧AI分析后编码
  10. js 笔记 -- 随机生成颜色值
  11. 马云点名的工程师,除了几百封求爱信还有13项区块链专利
  12. Matlab与线性代数 -- Hilbert矩阵
  13. optim优化器的使用
  14. JAVA习题001--产生多个随机数并使用冒泡排序将数字从小到大排序
  15. Windows找不到文件‘Chrome‘。请确定文件名是否正确后,再试一次
  16. 3分钟了解今日头条推荐算法原理
  17. 豆瓣最新国产电影Top10
  18. 牛客OR36 链表的回文结构
  19. 经纬坐标(BLH)数据创建.kml文件小工具设计 Java版
  20. python wifi模块

热门文章

  1. c++初始化成员列表_C++ 类构造函数初始化列表
  2. python找图里的环_python判断无向图环是否存在的示例
  3. python解析原理_python爬虫原理
  4. iMeta教程 | 使用PMS分析微生物组(图文+视频)
  5. 国科大生命科学学院华大专项-孙海汐导师课题组专访:去伪存真的过程一定不是一帆风顺的...
  6. Nature Reviews Cancer综述:长非编码RNA在肿瘤转移中的作用
  7. 图片压缩但质量不减,这个工具很不错
  8. Mac插件分享——AE插件、PS插件、FCPX插件【持续更新中】
  9. 服务器硬盘raid5扩容,超实用,物理服务器RAID扩容详解
  10. php 系统模版_原生 PHP 模板系统:Plates