objdump和readelf都可以用来查看二进制文件的一些内部信息. 区别在于objdump
借助BFD而更加通用一些, 可以应付不同文件格式, readelf则并不借助BFD,
而是直接读取ELF格式文件的信息, 按readelf手册页上所说, 得到的信息也略细致一些.
几个功能对比.

1. 反汇编代码
查看源代码被翻译成的汇编代码, 大概有3种方法,
1) 通过编译器直接从源文件生成, 如gcc -S 文件
2) 对目标代码反汇编, 一种是静态反汇编, 就是使用objdump  -d 文件
3) 另外一种就是对运行时的代码反汇编, 一般通过gdb

readelf并不提供反汇编功能.

objdump可以指定反汇编哪个节, 一般只有对包含指令的节反汇编才有意义. 而对于一些
其他的类型的节, objdump也可以将特殊节的数据以解析后的形式呈现出来

2. 显示relocation节的条目
-r参数显示elf文件的类型为REL的节的信息, 使用-S参数可以列出elf文件的
所有节的信息, 其中也就包括了REL节.

对于可重定位文件两者显示条目一致, 最重要的offset和type以及Sym.Name都有.

#readelf -r XXX.o

#objdump -r XXX.o

readelf的显示分节, 而objdump则将两个节合在一起. readelf的
显示更加清晰一些.

3. 显示动态重定位条目(或者可以认为是动态链接相关的重定位条目)
(按objdump的man page说明, 只对dynamic object有效, 如某些类型的共享库)
readelf和objdump等价的命令为readelf -D -r file和objdump -R file.

对readelf使用-r和-D -r的区别, 对于共享库在于数据的呈现方式略有不同. 这两种
都将数据解析后呈现出来. 前者显示的是相对于基地址的偏移, 后者则显示绝对偏移量.
前者显示条目数, 后者显示字节数.

另外有必要说明的是如果对可重定位文件(.o文件)应用这两个命令是无效的.

4. 显示节信息: readelf -S和objdump -h
对于可重定位文件, objdump -h不能显示.rel开头的节和.shstrtab, .symtab, .strtab.
而readelf的显示有一个.group节, 其内容为节的group, 可以用-g参数查看.

对于共享库, objdump -h仍然不能显示.shstrtab, .symtab, .strtab三个节, 另外还有
一个区别在于readelf从一个NULL类型的节开始, 而objdump的输出去掉了这个空的节.

5. 显示.dynamic节信息
只readelf -d有对应的功能, objdump没有. 另外需要注意, 看重定位文件不需要动态
链接(加载), 所以没有.dynamic节.

6. 显示程序段信息
第二个readelf支持而objdump没有的功能. 命令参数为readelf -l.
同样, 对于可重定位文件而言没有段. 这一点也可以从ELF头中看到, 命令为readelf -h.

7. 以字节(HEX或字符)形式dump某节的内容
readelf -x <secname>
objdump -s
后者默认一次dump所有节的内容. 如果只想dump某节的内容, 则用-j <secname>
参数指定. readelf一次只能dump某一节的内容.

8. 查看ELF程序头信息
readelf -h提供完整的信息, objdump -f只提供很少的信息.

9. 查看符号信息
readelf -s
objdump -t
两个命令都提供类似nm的信息.

注意readelf同时显示了.dynsym的信息, 而objdump实际上只显示了.symtab部分的信息.
如果需要显示动态部分的符号, 使用-T参数.

对readelf同时使用-D -s参数无效. 对照手册页说明也没弄清楚-D的主要用途,
在这里可能因为-s已经能够都显示了.

10. 一次全部
两个命令都提供了一个参数, 指定多个其他参数的集合一起显示, 但显示内容略有不同.
readelf -a: -h -l -S -r -s -d -n -V
objdump -x: -a -f -h -p -r -t

扩展阅读:

readelf和ldd分析elf文件

objdump查看目标文件构成

参考:

http://www.newsmth.net/pc/pccon.php?id=10001977&nid=316530

objdump与readelf相关推荐

  1. Linux ——objdump和readelf的使用

    在一个程序编译结束后,会生成****.o的文件,但往往当我们用vim命令查看这个文件内容时,就全是乱码, 像这样: 那么我们应该如何查看***.o文件呢? objdump和readelf的使用 obj ...

  2. Android objdump/nm/readelf使用

    1.objdump:查看反汇编so/bin为arm汇编 # aarch64-linux-android-objdump -a -S libtest.so2. readelf:读取linux系统ELF格 ...

  3. Linux 下nm 、objdump 和 readelf 比较

    ELF (Executable and Linkable Format) 是 Linux 和 Unix-like 系统上可执行文件.库文件.共享文件等的标准格式.它具有以下几个特征: 多平台支持:EL ...

  4. objdump and readelf

    编译器 arm-linux-gcc arm-linux-gcc hello.c -o hello 反汇编器 arm-linux-objdump arm-linux-objdump -D -S hell ...

  5. 段错误需要使用的工具 nm objdump readelf

    nm:列出目标文件中的符号. objdump:显示目标文件中的详细信息. readelf:显示关于 ELF 目标文件的信息. 具体的readelf命令可以查看 列表中的第一个工具是 nm,它可以列出目 ...

  6. 二进制实用程序(objdump, readelf,ar, nm等)

    二进制实用程序(objdump, readelf,ar, nm等) GNU 二进制实用程序Binutils (GNU binary utilities)包括:objdump.readelf.addr2 ...

  7. linux进程 exe可执行文件空,linux可执行文件的内容分析工具nm objdump readelf ar ldd

    转自:http://blog.csdn.net/eroswang/article/details/1967243 UNIX(R) 系统中运行的程序遵守一种称为目标文件格式的精心设计.了解更多关于目标文 ...

  8. java 抽象方法 虚方法的区别_声明抽象类(纯虚方法)会大幅增加二进制大小

    以下是故事:我正在使用AC6 Toolpack为Linux中的ARM Cortex-M0处理器开发C软件 . 在我使用Keil(在windows中)(拥有自己的工具链)之前,我已经迁移到GNU-too ...

  9. 从hello world 说程序运行机制

    http://www.cnblogs.com/yanlingyin/archive/2012/03/05/2379199.html 开篇 学习任何一门编程语言,都会从hello world 开始.对于 ...

最新文章

  1. 关于不能成为专业软件测试人员的10大理由的一些阐述
  2. 简单js特效代码大全_Django 功法大全
  3. 删除控制_别了 Flash!Win10已全面删除:已从控制面板和安装文件中消失
  4. adding oracle jvm 慢,java – 什么JVM优化导致这些性能结果?
  5. linux中sort命令
  6. LeetCode-基础动态规划-70. 爬楼梯
  7. 项目范围管理:项目范围管理的概念
  8. 谷歌40人发表59页长文:为何真实场景中ML模型表现不好?
  9. sql注入pythonpoco_.NET EF(Entity Framework)详解
  10. 转载:用大白话聊聊分布式系统
  11. 如何用两个开关控制同一盏灯
  12. android tag 快捷_Android Studio快捷键使用
  13. 求书:推荐阅读倡议书
  14. C#调用GDI+1.1中的函数实现高斯模糊、USM锐化等经典效果。
  15. 网络继电器的EPICS IOC搭建
  16. Java中判断String不为空的问题性能比较
  17. Qt信号和槽机制详解
  18. 实现div半透明效果
  19. lisp方格网法计算土方量_CAD计算土方方量插件
  20. 信息安全 —— 密码学

热门文章

  1. javascript如何实现功能的分析
  2. 基于FPGA系统合成两条视频流实现3D视频效果
  3. OpenCV 错误:无法打开摄像头(打开摄像头卡机)
  4. java与3d建模_3d建模加载,更新和在java中呈现
  5. const int * 、int * const、int const* 、const int a(){ } 和int a()const { }的区别和联系
  6. 设置VSCode打开键盘快捷方式和键盘快捷方式配置JSON分别快捷键为:Ctrl+Alt+K和Shift+Alt+K
  7. 自定义国内maven镜像包设置settings.xml
  8. 在Ubuntu 14.04 64bit上搭建单机本地节点Spark 1.3.0环境
  9. Python爬虫入门教程 54-100 博客园等博客网站自动评论器
  10. GreenPlum学习笔记:基础知识