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