Chinaunix首页 | 论坛 | 博客
  • 博客访问: 500134
  • 博文数量: 104
  • 博客积分: 3045
  • 博客等级: 少校
  • 技术积分: 1230
  • 用 户 组: 普通用户
  • 注册时间: 2008-02-29 10:18
文章分类

全部博文(104)

文章存档

2011年(72)

2010年(1)

2009年(1)

2008年(30)

分类: C/C++

2011-05-22 17:44:50

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

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

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

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

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


3. 显示动态重定位条目(或者可以认为是动态链接相关的重定位条目)

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

(按objdump的man page说明, 只对dynamic object有效, 如某些类型的共享库)
readelf和objdump等价的命令为readelf -D -r file和objdump -R file. 

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


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


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

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


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

9. 查看符号信息
readelf -s
objdump -t


注意readelf同时显示了.dynsym的信息, 而objdump实际上只显示了.symtab部分的信息. 

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

10. 一次全部
两个命令都提供了一个参数, 指定多个其他参数的集合一起显示, 但显示内容略有不同. 

如果需要显示动态部分的符号, 使用-T参数. 输出如下: 


阅读(2126) | 评论(2) | 转发(1) |
给主人留下些什么吧!~~

sjtlqy2011-05-23 12:47:59

好东西!!

GFree_Wind2011-05-23 12:07:07

虽然这两个工具不常用,但是当有棘手的问题时,确实有用。