美文网首页
binutils工具集

binutils工具集

作者: 罗蓁蓁 | 来源:发表于2017-12-28 18:42 被阅读165次

    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等等原理性质的东西。

    相关文章

      网友评论

          本文标题:binutils工具集

          本文链接:https://www.haomeiwen.com/subject/ofgvgxtx.html