Chinaunix首页 | 论坛 | 博客
  • 博客访问: 622434
  • 博文数量: 166
  • 博客积分: 970
  • 博客等级: 准尉
  • 技术积分: 547
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-06 15:16
个人简介

Believe youself!

文章分类

全部博文(166)

文章存档

2017年(1)

2016年(5)

2015年(117)

2014年(14)

2013年(11)

2012年(5)

2010年(4)

2009年(1)

2008年(8)

我的朋友

分类:

2015-04-17 17:01:06

原文地址:readelf objdump nm 作者:怪怪虎

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

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

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

[qtl@courier lib]$ objdump -d -j .plt libfoobar.so 

libfoobar.so:     file format elf32-i386

Disassembly of section .plt:

000003a4 <__gmon_start__@plt-0x10>:
 3a4:   ff b3 04 00 00 00       pushl  0x4(%ebx)
 3aa:   ff a3 08 00 00 00       jmp    *0x8(%ebx)
 3b0:   00 00                   add    %al,(%eax)
        ...

000003b4 <__gmon_start__@plt>:
 3b4:   ff a3 0c 00 00 00       jmp    *0xc(%ebx)
 3ba:   68 00 00 00 00          push   $0x0
 3bf:   e9 e0 ff ff ff          jmp    3a4 <_init+0x18>

000003c4 :
 3c4:   ff a3 10 00 00 00       jmp    *0x10(%ebx)
 3ca:   68 08 00 00 00          push   $0x8
 3cf:   e9 d0 ff ff ff          jmp    3a4 <_init+0x18>

000003d4 :
 3d4:   ff a3 14 00 00 00       jmp    *0x14(%ebx)
 3da:   68 10 00 00 00          push   $0x10
 3df:   e9 c0 ff ff ff          jmp    3a4 <_init+0x18>

000003e4 :
 3e4:   ff a3 18 00 00 00       jmp    *0x18(%ebx)
 3ea:   68 18 00 00 00          push   $0x18
 3ef:   e9 b0 ff ff ff          jmp    3a4 <_init+0x18>

000003f4 <__cxa_finalize@plt>:
 3f4:   ff a3 1c 00 00 00       jmp    *0x1c(%ebx)
 3fa:   68 20 00 00 00          push   $0x20
 3ff:   e9 a0 ff ff ff          jmp    3a4 <_init+0x18>

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

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

[qtl@courier lib]$ readelf -r bar.o 

Relocation section '.rel.text' at offset 0x4bc contains 6 entries:
 Offset     Info    Type            Sym.Value  Sym. Name
00000008  00000b02 R_386_PC32        00000000   __i686.get_pc_thunk.bx
0000000e  00000c0a R_386_GOTPC       00000000   _GLOBAL_OFFSET_TABLE_
00000025  00000d04 R_386_PLT32       00000000   cos
0000002e  00000e03 R_386_GOT32       00000000   stdout
00000044  00000509 R_386_GOTOFF      00000000   .rodata
00000050  00000f04 R_386_PLT32       00000000   fprintf

[qtl@courier lib]$ objdump -r bar.o 

bar.o:     file format elf32-i386

RELOCATION RECORDS FOR [.text]:
OFFSET   TYPE              VALUE 
00000008 R_386_PC32        __i686.get_pc_thunk.bx
0000000e R_386_GOTPC       _GLOBAL_OFFSET_TABLE_
00000025 R_386_PLT32       cos
0000002e R_386_GOT32       stdout
00000044 R_386
阅读(789) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~