Linux Program Tools (Linux Binutils)

来源:互联网 发布:thinkphp直播系统源码 编辑:程序博客网 时间:2024/06/16 22:27
一、Linux Binutils
1, 概要:
    Linux binutils 是一系列软件开发工具(Tools)的集合,包括连接器(Linker),汇编器(Assembler),以及其他处理对象文件(Object files)及档案文件(Archives files)的工具。可以从ftp://ftp.gnu.org/gnu/binutils/下载工具包。安装Binutils后,就可以使用如下工具:addr2line, ar, as, c++filt, gprof, ld, nm, objcopy, objdump, ranlib, readelf, size, strings and strip。

2, 简介:
2.1 addr2line
    将程序地址转换为相应的文件名,源程序行号,甚至所在的函数名。注意,编译时加-g才能正常显示文件名及行号,否则文件名显示为??,行号显示为0(函数名可以正常显示);若连接时加-s, 或用strip去掉可执行文件的符号表,则调用addr2line无法显示正确信息。

2.2 as
    汇编器

2.3 c++filt
    用C++和Java实现的程序,在编译之后,会重新命名原函数名,方法是在原函数名前后加字母,数字,下划线,美元符或小数点;这个过程称为混淆(Mangling)。而c++filt的功能是Mangling的反向过程,它在当前文件夹下查询包含该符号的可执行文件,然后将混淆后的函数名还原成程序中的原始函数名,称为Demangling。
eg:
    //test.c
    #include <iostream>
    using namespace std;

    void Print(char *name)
    {
       cout << name << ends;
    }

    void Print(int data)
    {
       cout << data << endl;
    }

    int main(int argc, char **argv)
    {
       Print("John");
       Print(100);

       return 100;
    }

    编译连接之后, 用nasm -D test查出两个函数Print在mangling之后的民称分别为:
    _Z5PrintPc和_Z5Printi, 执行
    c++filt _Z5PrintPc
    将会显示
    Print(char *)

二、Other Userful Tools
1 Strace:
   Trace system call and signals

2 readelf
   Display information abut ELF files

3 ldd
   Print shell library dependences