Chinaunix首页 | 论坛 | 博客
  • 博客访问: 115710
  • 博文数量: 22
  • 博客积分: 835
  • 博客等级: 准尉
  • 技术积分: 260
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-25 21:23
文章分类

全部博文(22)

文章存档

2011年(1)

2009年(21)

我的朋友

分类: LINUX

2009-12-01 19:57:33

1、GNU Binutils包中除包括了极其重要的汇编器和链接器外,还包括一系列的二进制分析工具,用的比较多的有:ar/nm/objdump/readelf/addr2line等,除了这些工具外Binutils还包括了二进制工具用到的非常重要的开发库BFD和Optcode。其中BFD是根据目标文件的类型进行读写操作的库,它可以支持多种目标文件COFF/a.out/ELF,这里我们只需要熟悉ELF就可以了Optcode库则是用于汇编和反汇编的,比如objdump -d, GDB的disassembler则需要用到此库。

下面是BFD学习地址:
使用BFD操作ELF:http://www.xfocus.net/articles/200109/265.html 


2、除了as和ld外,其他的二进制分析工具有如下,下面列出各个工具最常用的方法:
ar: Create, modify, and extract from archives
用来创建,修改,释放归档文件,常用来管理静态链接文件,下面是几种常见用法:
 1)生成静态库文件:ar rcs test.a test1.o test2.o
 2)显示静态库中的包括的文件:ar -t test.a
 3)从静态库中释放所有的.o文件:ar -x test.a
 4)从归档中删除一个文件:ar -d test.a test1.o
 5)添加一个文件到归档库:ar -q test3.o test.a
   
nm: List symbols from object files
用来显示目标文件的符号表,目标文件包括:*.o,*.so, elf文件,下面是几种常见用法:
在学习ld符号表部分的时候经常可以用到,
 0)显示所有的符号信息:nm -a test
 1)只显示静态的和外部的(全局)符号:nm -e test
 2)显示完整的输出,包括冗余的 .text、 .data 以及 .bss 符号:nm -f test
 3)只显示外部的(全局)符号:nm -g test
 4)只显示未定义符号:nm -u test
参考地址:http://blog.chinaunix.net/u/30686/showart_455864.html
 
objcopy: Copy and translate object files
使用bfd来将一种格式的文件转换为另一种格式的文件,还可以用来去除掉一些没作用的区,一般用的比较少:
 1)将hello文件转换为srec格式的文件hello_srec:objcopy -O srec hello hello_srec
 2)将下面几个没作用的段去掉:objcopy –R .comment –R .note.ABI-tag –R .gnu.version test test1
 
objdump: Display information from object files
学习ld的时候经常用到,可以用来详细显示目标文件的信息,两一个重要的功能就是反汇编:
 0)反汇编的同时显示原代码:objdump -S test 
 1)反汇编代码段的内容:objdump -d test
 2)反汇编所有段的内容:objdump -D test 
 3)显示所有的头信息:objdump -x test
 4)显示所有段的二进制数据:objdump -s test
 5)显示调试信息:objdump -g test
 6)显示静态/动态符号表信息:objdump -t/T test
 7)显示静态/动态可重定位信息:objdump -r/T test
 
ranlib: Generate index to archive contents
为归档文件产生符号索引,如果ar生成归档文件的时候,有-s选项,则不需要用ranlib步骤:
 1)ar rc test.a tset1.o test2.o
    ranlib test.a
 
readelf: Display the contents of ELF format files
专门用来显示elf格式的目标文件的信息,功能可能和objdump有些重叠,objdump显示目标文件通用的信息。
readelf用的比较多,下面是一些常用的选项:
 1)显示文件头,段头,区头,符号表,可重定位表,动态表等信息:Readelf -a test  
 2)详细显示各区的信息:readelf -t test
 
addr2line: Convert addresses to file and line
常用来进行诊断定位问题的代码,比如crush在一个地址处,要从该进程空间的地址找到对应的代码,则可以用该工具来定位:
 1)addr2line -e test 08048580 (后面跟上的是一个属于进程代码段空间的地址)
但需要注意的是:该可执行文件编译的时候一定要带上-ggdb调试选项,否则查找不到任何信息。
 
gprof: 一个性能测试工具,但测试的程序需要编译的时候加上"-pg",然后后执行一遍后,生成了gmon.out文件
则可以按照:gprof ./test进行测试,测试结果中显示了每个函数的调用次数,每个函数消耗的处理器时间。
也可以显示“调用图”,包括函数的调用关系,每个函数调用花费了多少时间。
还可以显示“注释的源代码”,是程序源代码的一个复本,标记有程序中每行代码的执行次数。
 1)gcc -Wall -g -pg test.c -o test
 2)./test
 3)gprof ./test
//下面的可以能用的稍微少点
size: List section sizes and total size
 1)显示目标文件.o/.a中text,data,bss区的大小:size test.a
 问题:显示的大小和readelf读到的大小不一致
 
strings: List printable strings from files
显示目标文件中可以显示的字符,一般都是从.strtab区中提取出数据
 1)显示已经初始化的和可载入的段中的字符:string test  
 2)显示所有可显示的字符:string -a test
 
strip: Discard symbols
常用来缩减或者节省可执行文件的大小,把目标文件中的符号表信息去掉,调试信息也会被删除掉;
 1)strip test去掉各类符号表,包括所有的的调试信息
  

下面几个工具用的更少,暂不作研究:
c++filt: Filter to demangle encoded C++ symbols
cxxfilt: MS-DOS name for c++filt
nlmconv: Converts object code into an NLM
windres: Manipulate Windows resources
windmc: Generator for Windows message resources
dlltool: Create files needed to build and use DLLs

3、关于Binutils包的其他介绍:
1)网页式介绍:
2)原代码查看:
3)下载原代码:
阅读(1606) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~