ELF格式文件符号表全解析及readelf命令使用方法

From:http://blog.csdn.net/yasi_xi/article/details/45197583

readelf命令:http://man.linuxde.net/readelf

ELF文件格式解析:https://www.2cto.com/kf/201605/511370.html

ELF文件格式解析:http://blog.csdn.net/earbao/article/details/51746275

可执行文件(ELF)格式的理解------系列文章:http://www.cnblogs.com/xmphoenix/archive/2011/10/23/2221879.html

Linux内核分析——ELF文件格式分析:http://www.cnblogs.com/20135223heweiqin/p/5554922.html

linux第三次实践:ELF文件格式分析:http://www.cnblogs.com/cdcode/p/5551649.html

程序破解及ELF文件格式分析:http://www.jianshu.com/p/7a75324e98ab

Android逆向之旅---SO(ELF)文件格式详解:https://blog.csdn.net/zhangmiaoping23/article/details/82314758

 

 

1、readelf 命令

 

示例:hello.c 程序

#include <stdio.h>
#include <stdlib.h>int main()
{int a=100;printf("hello world!\n");return 0;
}

 

1. 读取 ELF 文件头:readelf -h hello.o

输出结果说明

ELF Header:Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00Class:                                 ELF64Data:                                  2's complement, little endianVersion:                               1 (current)OS/ABI:                                UNIX - System VABI Version:                           0Type:  EXEC(Executable file)(.so文件DYN(Shared object file)、.o文件REL(Relocatable file)、Core dump文件(CORE))Machine:                               Advanced Micro Devices X86-64Version:                               0x1Entry point address:                   0x400510Start of program headers:              64 (bytes into file)Start of section headers:              3072 (bytes into file)Flags:                                 0x0Size of this header:                   64 (bytes)Size of program headers:               56 (bytes)Number of program headers:             8Size of section headers:               64 (bytes)Number of section headers:             31Section header string table index:     28在 readelf 的输出中:
第 1 行,ELF Header: ELF 文件头开始。
第 2 行,Magic 魔数,用来指名该文件是一个 ELF 目标文件。第一个字节 7F 是个固定的数;后面的 3 个字节正是 E, L, F 三个字母的 ASCII 形式。
第 3 行,CLASS 表示文件类型,这里是 64位的 ELF 格式。
第 4 行,Data 表示文件中的数据是按照什么格式组织(大端或小端)的,不同处理器平台数据组织格式可能就不同,如x86平台为小端存储格式。
第 5 行,当前 ELF 文件头版本号,这里版本号为 1 。
第 6 行,OS/ABI ,指出操作系统类型,ABI 是 Application Binary Interface 的缩写。
第 7 行,ABI 版本号,当前为 0 。
第 8 行,Type 表示文件类型。ELF 文件有 3 种类型,一种是如上所示的 Relocatable file 可重定位目标文件,一种是可执行文件(Executable),另外一种是共享库(Shared Library) 。
第 9 行,机器平台类型。
第 10 行,当前目标文件的版本号。
第 11 行,程序的虚拟地址入口点,因为这还不是可运行的程序,故而这里为零。
第 12 行,与 11 行同理,这个目标文件没有 Program Headers。
第 13 行,sections 头开始处,这里 208 是十进制,表示从地址偏移 0xD0 处开始。
第 14 行,是一个与处理器相关联的标志,x86 平台上该处为 0 。
第 15 行,ELF 文件头的字节数。
第 16 行,因为这个不是可执行程序,故此处大小为 0。
第 17 行,同理于第 16 行。
第 18 行,sections header 的大小,这里每个 section 头大小为 40 个字节。
第 19 行,一共有多少个 section 头,这里是 8 个。
第 20 行,section 头字符串表索引号,从 Section Headers 输出部分可以看到其内容的偏移在 0xa0 处,从此处开始到0xcf 结束保存着各个 sections 的名字,如 .data,.text,.bss等。

 

2. 显示程序头表:readelf -l a.out

上述各段组成了最终在内存中执行的程序,其还提供了各段在虚拟地址空间和物理地址空间中的大小、位置、标志、访问授权和对齐方面的信息。各段语义如下:

  • PHDR :保存程序头表 ( Program header  => PHDR)
  • INTERP :指定程序从可行性文件映射到内存之后,必须调用的解释器。它是通过链接其他库来满足未解析的引用,用于在虚拟地址空间中插入程序运行所需的动态库。
  • LOAD :表示一个需要从二进制文件映射到虚拟地址空间的段,其中保存了常量数据(如字符串),程序目标代码等。
  • DYNAMIC :保存了由动态连接器(即INTERP段中指定的解释器)使用的信息。

 

3. 读取节头表:readelf -S 

读取 .o 文件

 ( 也叫做  ,类比 竹子,一节一节 的)说明:

  • .text已编译程序的机器代码。
  • .rodata只读数据,比如:printf 语句中的格式串 和 开关(switch)语句的跳转表。
  • .data已初始化全局C变量。局部C变量在运行时被保存在栈中,既不出现在.data中,也不出现在.bss节中。
  • .bss未初始化全局C变量。在目标文件中,未初始化变量不占据实际的空间,它仅仅是一个占位符。目标文件格式区分初始化和未初始化变量是为了空间效率在。
  • .symtab一个符号表(symbol table),它存放在程序中被定义和引用的函数和全局变量的信息。一些程序员错误地认为必须通过 -g 选项来编译一个程序,得到符号表信息。实际上,每个可重定位目标文件在 .symtab 中都有一张符号表。然而,和编译器中的符号表不同,.symtab 符号表不包含局部变量的表目。
  • .rel.text:当链接噐把这个目标文件和其他文件结合时,.text节中的许多位置都需要修改。一般而言,任何调用外部函数或者引用全局变量的指令都需要修改。另一方面调用本地函数的指令则不需要修改。注意,可执行目标文件中并不需要重定位信息,因此通常省略,除非使用者显式地指示链接器包含这些信息。
  • .rel.data被模块定义或引用的任何全局变量的信息。一般而言,任何已初始化全局变量的初始值是全局变量或者外部定义函数的地址都需要被修改。
  • .debug:一个调试符号表,其有些表目是程序中定义的局部变量和类型定义,有些表目是程序中定义和引用的全局变量,有些是原始的C源文件。只有以 -g 选项调用编译驱动程序时,才会得到这张表。
  • .line:原始C源程序中的行号和.text节中机器指令之间的映射。只有以 -g 选项调用编译驱动程序时,才会得到这张表。
  • .strtab:一个字符串表,其内容包括 .symtab 和 .debug 节中的符号表,以及节头部中的节名字。字符串表就是以null结尾的字符串序列。

读取可执行文件

  • PROGBITS (程序必须解释的信息,如二进制代码),
  • STRTAB用于存储与ELF格式有关的字符串,但与程序没有直接关联,如各个节的名称(.text, .comment)
  • .data 保存初始化过的数据,这是普通程序数据的一部分,可以在程序运行期间修改。
  • .rodata 保存了只读数据,可以读取但不能修改,例如 print f语句中的所有静态字符串封装到该节。
  • .init 和 .fini 保存了进程初始化和结束所用的代码,这通常是由编译器自动添加的。
  • .hash 是一个散列表,允许在不对全表元素进行线性搜索的情况下,快速访问所有符号表项。

 

4. 符号表机制(readelf -s)

 

符号表保存了程序实现或使用的所有全局变量和函数

如果程序引用一个自身代码未定义的符号,则称之为未定义符号,这类引用必须在静态链接期间用其他目标模块或库解决,或在加载时通过动态链接解决。

实现:

  • .symtab 确定符号的名称与其值之间的关联,其中名称不是直接以字符串形式出现的,而是表示为某一字符串数组(.strtab)的索引。
  • .strtab 保存了字符串数组(.shstrtab包含了节名称字符串表)。
  • .hash 保存了一个散列表,以帮助快速查找符号。
typedef struct elf64_sym {Elf64_Word st_name;        // 符号名称,字符串表中的索引STT_OBJECT表示符号关联到一个数据对象,如变量、数组或指针;STT_FUNC表示符号关联到一个函数;STT_NOTYPE表示符号类型未指定,用于未定义引用unsigned char st_info;     // 类型和绑定属性:STB_LOCAL/STB_GLOBAL/STB_WEAK;unsigned char st_other;    // 语义未定义,0Elf64_Half st_shndx;       // 相关节的索引,符号将绑定到该节,此外SHN_ABS指定符号是绝对值,不因重定位而改变,SHN_UNDEF标识未定义符号。Elf64_Addr st_value;       // 符号的值Elf64_Xword st_size;       // 符号的长度,如一个指针的长度或struct对象中包含的字节数。
} Elf64_Sym;

 

实例:

 

readelf 用来显示 ELF 格式文件信息,该命令选项很多,其中 -a 选项可以用来显示 ELF 文件的所有信息。

下面对 -a 选项的输出内容进行分析。源码如下:

进行 gcc 编译,等操作:

例如:我想解析出我在 test.c 文件中写的全局变量的内容。可以查看 符号表( Symbol table '.dynsym')部分

其中字段中有 OBJECT 和 GLOBAL 的即为全局变量,我们在 test.c 中定义的全局变量会出现在里面,如上图中 244 和 252 行。

以及一些函数等内容都可以在这段区域内找到相应的地址和大小信息等。。。

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/496358.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Data JPA 从入门到精通~QueryByExampleExecutor的使用

QueryByExampleExecutor 的使用 按示例查询&#xff08;QBE&#xff09;是一种用户友好的查询技术&#xff0c;具有简单的接口&#xff0c;它允许动态查询创建&#xff0c;并且不需要编写包含字段名称的查询。从 UML 图中&#xff0c;可以看出继承 JpaRepository 接口后&#…

谷歌大脑提出对智能体进行「正向-反向」强化学习训练,加速训练过程

原文来源&#xff1a;arXiv作者&#xff1a;Ashley D. Edwards、Laura Downs、James C. Davidson「雷克世界」编译&#xff1a;嗯~是阿童木呀、KABUDA、EVA在强化学习问题中&#xff0c;关于任务目标的制定&#xff0c;往往需要开发人员花费很多的精力&#xff0c;在本文中&…

Linux二进制实用工具Binutils工具集解析()

From&#xff1a;http://blog.csdn.net/zqixiao_09/article/details/50783007 GNU Binutils&#xff1a;http://www.gnu.org/software/binutils/ GNU Binutils详解&#xff1a;http://www.crifan.com/files/doc/docbook/binutils_intro/release/html/binutils_intro.html 交叉…

Spring Data JPA 从入门到精通~JpaSpecificationExecutor的使用方法

JpaSpecificationExecutor 源码和 API 我们也可以通过 idea 工具详细看其用法和实现类&#xff0c;JpaSpecificationExecutor 是 Repository 要继承的接口&#xff0c;而 SimpleJpaRepository 是其默认实现。而通过源码来看其提供的 API 比较简单、明了&#xff0c;有如下几个方…

谷歌人工智能野心:从“下围棋”开始走向商用赚钱

来源&#xff1a;腾讯科技作为人工智能研发的领先企业&#xff0c;谷歌已经开始从技术研发走向了产品商用&#xff0c;创造营收成为一个新目标。谷歌在人工智能领域进行研发的时间比较长&#xff0c;陆续收购了优秀的专业公司。鉴于此&#xff0c;谷歌获得了先发优势&#xff0…

Linux异步之信号(signal)机制分析

From&#xff1a;http://www.cnblogs.com/hoys/archive/2012/08/19/2646377.html From&#xff1a;http://kenby.iteye.com/blog/1173862 Linux下的信号详解及捕捉信号&#xff1a;http://www.jb51.net/article/90695.htm linux信号详解&#xff1a;http://blog.csdn.net/f…

DeepMind集成AI智能体架构「MERLIN」:基于目标导向智能体中的无监督预测记忆

来源&#xff1a;arXiv摘要&#xff1a;在自然界中&#xff0c;动物往往会执行目标导向的行为&#xff0c;尽管它们的传感器的范围有限。作者&#xff1a;Greg Wayne、 Chia-Chun Hung、David Amos、Mehdi Mirza、Arun Ahuja、Agnieszka Grabska-Barwinska、Jack Rae、Piotr Mi…

手机反编译java源码,Android反编译(一)之反编译JAVA源码

Android反编译(一)之反编译JAVA源码[目录]1、工具2、反编译步骤步骤1&#xff1a;把apk文件后缀名改为.zip步骤2&#xff1a;解压zip包得到classes.dex步骤3&#xff1a;将Dex反编译为Jar包(工具&#xff1a;dex2jar)命令: CMD>dex2jar.bat classes.dex步骤4&#xff1a;用j…

一文详解计算机视觉的广泛应用:网络压缩、视觉问答、可视化、风格迁移等

作者 | 张皓&#xff08;南京大学&#xff09;来源&#xff1a;人工智能头条丨公众号引言深度学习目前已成为发展最快、最令人兴奋的机器学习领域之一&#xff0c;许多卓有建树的论文已经发表&#xff0c;而且已有很多高质量的开源深度学习框架可供使用。然而&#xff0c;论文通…

Linux-进程、进程组、作业、会话、控制终端详解

From&#xff1a;http://www.cnblogs.com/JohnABC/p/4079669.html Linux进程优先级的处理--Linux进程的管理与调度(二十二)&#xff1a;http://blog.csdn.net/gatieme/article/details/51719208 进程 、进程组、会话、控制终端之间的关系&#xff1a;http://blog.csdn.net/y…

浅谈项目开发现状(一)

在现在的软件开发中&#xff0c;一些大的软件公司有充分的资金&#xff0c;所以他的公司人员组织架构能组成&#xff1a;需求分析团队&#xff08;为了更好的了解用户的完整需求&#xff09;--->研发团队&#xff08;通过计算机语言来实现用户需求&#xff09;&#xff0c;方…

波士顿咨询:2018最具创新力企业50强

来源&#xff1a;前瞻网在波士顿咨询公司评选的2018年最具创新力公司中&#xff0c;有11家公司——其中包括前10名中的7家——都是“数字原住民”&#xff0c;按定义也就是“数字创新者”。榜单上大多数公司已经将数字技术建立在他们的创新计划中。这一趋势在各个行业都很普遍&…

Linux 线程

Linux 的多线程编程的高效开发经验&#xff1a;https://www.ibm.com/developerworks/cn/linux/l-cn-mthreadps/ linux线程的实现&#xff1a;http://www.cnblogs.com/zhaoyl/p/3620204.html 线程概念经典解析&#xff1a;http://blog.chinaunix.net/uid-29613952-id-421477…

Spring Data JPA 从入门到精通~JpaSpecificationExecutor实现原理

JpaSpecificationExecutor 实现原理 我们还是先通过开发工具&#xff0c;把关键的类添加到Diagram上面进行分析&#xff0c;如图&#xff1a; 我们通过上图可以看一下&#xff0c;前面介绍的几个类之间的关联关系。 SimpleJpaRepository 实现类中的关键源码如下&#xff1a; …

微信发布首份《移动支付时代的无人零售报告》

来源&#xff1a;爱范儿 作者&#xff1a;Panda3 月 30 日&#xff0c;微信支付行业运营总监白振杰在 2018 智慧无人零售大会上发布了《移动支付时代的无人零售行业报告》&#xff0c;报告首次结合中国百货商业协会权威调研和微信支付的数据分析能力&#xff0c;揭示了移动支…

盘点《头号玩家》里的 VR 技术,现在就能造个 Oasis 出来

来源&#xff1a;沉浸感丨公众号 作者&#xff1a; 刘芳平由史蒂文斯皮尔伯格导演的科幻电影《头号玩家》&#xff08;Ready One Player&#xff09;于 3 月 30 日在中国大陆上映。首个周末便收获广泛好评&#xff0c;登上豆瓣电影本周口碑榜第一名&#xff0c;截止 31 日晚积…

find()matlab,Matlab 之 find()函数

当我第一次用matlab语言编写一个工程项目时&#xff0c;发现自己编写的脚本里循环特别多&#xff0c;导致编程效率很低&#xff0c;这让我特别苦恼。有一次导师让我阅读他编写的一个Matlab脚本&#xff0c;并按照新要求对其进行更改。我发现脚本里多次用到find()函数&#xff0…

一图看懂阿里云IoT战略

来源&#xff1a;云栖社区从万物互联到万物智联&#xff0c;离不开“无处不在的计算”。阿里云IoT在云边端部署了可协同的计算&#xff0c;基于物联网使能平台联合开发者、芯片模组厂商、行业合作伙伴等在城市、生活、汽车、制造四大领域已完成深度布局&#xff0c;即一朵云、两…

matlab机器人模型仿真,一知半解|MATLAB机器人建模与仿真控制(1)

各位机器人技术爱好者们&#xff0c;大家好&#xff01;很荣幸受古月老师邀请&#xff0c;成为古月居的签约作者。希望在这里可以同大家相互交流与学习。始终觉得自己能力不足&#xff0c;但终于还是硬着头皮开始了在古月居的第一篇博客。由于我是机械专业出身&#xff0c;在接…

第四期《Summer Tree》 已经整理完毕

虽然已经整理完毕&#xff0c;但是却没有空间上传&#xff0c;由于太大了上传不了.下次再补充回来 如果地址下载不到&#xff0c;告诉我。呵呵 我上传在微软共享空间里面 在这里可以下载在这里转载于:https://www.cnblogs.com/hero82748274/archive/2009/06/06/1497771.html