linux elf文件格式
一、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文件格式相关推荐
- Linux ELF文件格式介绍
文章目录 一.引言 二.介绍 三.ELF目标文件格式 3.1 常见段及对应用途 3.2 目标文件内容解析 3.2.1 代码段.text 3.2.2 只读数据段.rodata 3.2.3 数据段.dat ...
- linux ELF文件格式分析
一.ELF文件格式概述 1. ELF:是一种对象文件的格式,用于定义不同类型的对象文件中都放了什么东西.以及都以什么样的格式去放这些东西. 二.分析一个ELF文件 以一个最简单的helloworld程 ...
- linux 文件格式elf,linux ELF 文件格式 | ZION
ELF 文件类型 ELF (Executable Linkable Format) 是linux下的可执行文件格式,与windows下的PE (Portable Executable) 格式一样,都是 ...
- linux分析文件格式,linux elf文件格式分析
#include void main() { printf("hello,jinxin!"); } 然后执行: gcc -o jin jin.c readelf -a jin EL ...
- linux的静态编译elf无法调试,[翻译]自己动手编写一个Linux调试器系列之4 ELF文件格式与DWARF调试格式 by lantie@15PB...
自己动手编写一个Linux调试器系列之4 ELF文件格式与DWARF调试格式 by lantie@15PB 在上一节中,你已经听说了DWARF调试格式,它是程序的调试信息,是一种可以更好理解源码的方式 ...
- Linux内存管理:ELF文件格式
Linux内存管理:ELF文件格式 rtoax 2021年3月 1. ELF文件格式 ELF (Executable and Linkable Format)是一种为可执行文件,目标文件,共享链接库和 ...
- Linux中GCC编译工具集中个软件的用途、gcc的简单编译以及ELF文件格式
文章目录 一.gcc编译工具集中各软件的用途 1.1 GCC 1.2 Binutils 1.3 C运行库 二.简单编译 2.1 代码编译过程 2.2 多个程序文件的编译 2.3 检错 2.4 库文件连 ...
- linux 程序怎么执行文件格式,linux汇编之——(1)ELF:Linux可执行程序文件格式
Windows的应用程序的格式是PE格式文件,LINUX的是ELF("Executable and Linking Format")文件格式. 一个手工打造的ELF文件,代码如下: ...
- Linux里gcc编译过程分析和ELF文件格式学习
GCC编译器背后的故事及常用命令.了解ELF文件格式 前言 一.GCC简介 二.GCC背后的战友 1.Binutils 2.C运行库 三.GCC编译流程及对应命令 1.编译流程图及命令框图 2.实践操 ...
最新文章
- 如何现在就用到 Ubuntu 21.10
- 浪潮英特尔在德国发布KEEP升级计划 用户可提前体验英特尔KNM
- c++ 低位在前 高位在后_生意社:醋酸市场前三季度区间震荡 四季度一飞冲天
- 中国江苏省动漫产业发展导向及运营前景规划咨询报告2021-2027年
- 一步步在SAP Cloud Platform上创建HANA实例并使用
- [前台]---关于input标签的value值
- Java大牛的一些总结,献给对未来还在迷茫中的你!
- Code::Blocks 16.01 改变注释的的颜色
- 视频帧AI分析后编码
- js 笔记 -- 随机生成颜色值
- 马云点名的工程师,除了几百封求爱信还有13项区块链专利
- Matlab与线性代数 -- Hilbert矩阵
- optim优化器的使用
- JAVA习题001--产生多个随机数并使用冒泡排序将数字从小到大排序
- Windows找不到文件‘Chrome‘。请确定文件名是否正确后,再试一次
- 3分钟了解今日头条推荐算法原理
- 豆瓣最新国产电影Top10
- 牛客OR36 链表的回文结构
- 经纬坐标(BLH)数据创建.kml文件小工具设计 Java版
- python wifi模块
热门文章
- c++初始化成员列表_C++ 类构造函数初始化列表
- python找图里的环_python判断无向图环是否存在的示例
- python解析原理_python爬虫原理
- iMeta教程 | 使用PMS分析微生物组(图文+视频)
- 国科大生命科学学院华大专项-孙海汐导师课题组专访:去伪存真的过程一定不是一帆风顺的...
- Nature Reviews Cancer综述:长非编码RNA在肿瘤转移中的作用
- 图片压缩但质量不减,这个工具很不错
- Mac插件分享——AE插件、PS插件、FCPX插件【持续更新中】
- 服务器硬盘raid5扩容,超实用,物理服务器RAID扩容详解
- php 系统模版_原生 PHP 模板系统:Plates