binutils工具集
GNU binutils是一个二进制工具集。主要包括:
ld:gnu链接器;
as:gnu汇编器。
也包括:
addr2line:把地址转化为文件名和行号;
nm:列出目标文件的符号列表;
objdump:显示目标文件信息;
readelf:显示elf格式的文件信息;
objcopy:拷贝部分section以生成新的可执行文件,elf->hex,elf->bin等;
ar:创建,修改,解压一个静态库文件;
size:显示目标文件的节大小;
strings:从目标文件中列出可打印的字符串;
c++filt:过滤c++符号为可识别的c符号;
ranlib:生成库文件中的.o文件索引;
strip:丢弃程序文件中的符号信息。
以上就是binutils工具集,它们大都使用BFD,二进制文件描述符库。为了更低等级的操作,它们很多也使用opcodes库来汇编以及反汇编机器指令。
那么那几个比较重要呢?
很显然有:objdump,readelf,以及addr2line和nm。因为当报错,需要debug时,需要用到它们。ld和as当然也非常重要,但它们用于编译链接,而且命令复杂得单独剔出来讲解。
次重要有:objcopy,ar,size,string,因为它们很少用到,一般是写到makefile中。
最次的有:c++filt,ranlib,strip,因为它们的功能完全可以被上面重要的binutils替代。
addr2line:
addr2line 0x401110 -f -e test.elf
addr2line 0x401110 --demangle -f -e test.elf
从而获得该地址所在有的符号和源码文件名。使用addr2line的前提是程序文件中存在符号表,即编译时有-g调试参数。
它可以结合nm使用,效果最佳。
nm -n test.elf
nm --demangle -n test.elf
通过nm可以找到对应的符号,以及符号的地址和符号所放的位置。
然后通过符号的地址,使用addr2line找到符号所在源码文件名。
nm中符号符号所放的位置如下:
image.png
objdump -D –S test.elf
objcopy –j .text test.elf onlytest.elf
objcopy -R .text test.elf notext.elf
objcopy --strip-debug test.elf == strip test.elf
ar crs libtest.a foo.o bar.o ====ranlib libtest.a仅添加索引类似
最后,怎么使用二进制工具不重要,重要的是你大概知道每个工具有什么用,需要用到的时候可以尽快通过—help找到用法。更重要的是要了解elf原理,了解BFD,opcodes等等原理性质的东西。
网友评论