Linux程序分析工具介绍

本文要介绍的ldd和nm是linux下,两个用来分析程序很实用的工具。ldd是用来分析程序运行时需要依赖的动态库的工具;nm是用来查看指定程序中的符号表相关内容的工具。下面通过例子,分别来介绍一下这两个工具:

1. ldd, 先看下面的例子, 用ldd查看cs程序所依赖的动态库:

$ ldd cs   linux-gate.so.1 =>  (0xffffe000)   libz.so.1 => /lib/libz.so.1 (0xb7f8c000)   libpthread.so.0 => /lib/libpthread.so.0 (0xb7f75000)   libcrypto.so.0.9.8 => /usr/lib/libcrypto.so.0.9.8 (0xb7e4d000)   libpcre.so.0 => /usr/lib/libpcre.so.0 (0xb7e21000)   libstdc++.so.6 => /usr/local/gcc4.5.1/lib/libstdc++.so.6 (0xb7d40000)   libm.so.6 => /lib/libm.so.6 (0xb7d18000)   libgcc_s.so.1 => /usr/local/gcc4.5.1/lib/libgcc_s.so.1 (0xb7cfd000)   libc.so.6 => /lib/libc.so.6 (0xb7bbc000)   /lib/ld-linux.so.2 (0xb7fab000)   libdl.so.2 => /lib/libdl.so.2 (0xb7bb7000)  

在上面的例子中,ldd的结果可以分为三列来看:

•第一列:程序需要依赖什么库
•第二列: 系统提供的与程序需要的库所对应的库
•第三列:库加载的开始地址
通过上面的信息,我们可以得到以下几个信息:

•(1) 通过对比第一列和第二列,我们可以分析程序需要依赖的库和系统实际提供的,是否相匹配
•(2) 通过观察第三列,我们可以知道在当前的库中的符号在对应的进程的地址空间中的开始位置
2. nm, 通过下面的例子,我们来介绍nm工具:

先看一下这个简单的程序:

#include "iostream"        using namespace std;       class Test   {   public:       void Hello()       {           cout < < "Hello world!" << endl;       }   };       int main()   {       Test test;       test.Hello();   }  

接下来,我们编译该程序,然后看nm的结果:

$ g++ test.cc -o test   c$ nm test   08049f10 d _DYNAMIC   08049ff4 d _GLOBAL_OFFSET_TABLE_   080486f0 t _GLOBAL__I_main   080487fc R _IO_stdin_used            w _Jv_RegisterClasses   080486b0 t _Z41__static_initialization_and_destruction_0ii   0804870c W _ZN4Test5HelloEv            U _ZNSolsEPFRSoS_E@@GLIBCXX_3.4            U _ZNSt8ios_base4InitC1Ev@@GLIBCXX_3.4            U _ZNSt8ios_base4InitD1Ev@@GLIBCXX_3.4   0804a040 B _ZSt4cout@@GLIBCXX_3.4            U _ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@@GLIBCXX_3.4   0804a0d4 b _ZStL8__ioinit            U _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@@GLIBCXX_3.4   08049f00 d __CTOR_END__   08049ef8 d __CTOR_LIST__   08049f08 D __DTOR_END__   08049f04 d __DTOR_LIST__   080488c8 r __FRAME_END__   08049f0c d __JCR_END__   08049f0c d __JCR_LIST__   0804a02c A __bss_start            U __cxa_atexit@@GLIBC_2.1.3   0804a024 D __data_start   080487b0 t __do_global_ctors_aux   08048610 t __do_global_dtors_aux   0804a028 D __dso_handle            w __gmon_start__            U __gxx_personality_v0@@CXXABI_1.3   080487aa T __i686.get_pc_thunk.bx   08049ef8 d __init_array_end   08049ef8 d __init_array_start   08048740 T __libc_csu_fini   08048750 T __libc_csu_init            U __libc_start_main@@GLIBC_2.0   0804a02c A _edata   0804a0d8 A _end   080487dc T _fini   080487f8 R _fp_hw   08048508 T _init   080485e0 T _start   0804a0cc b completed.7065   0804a024 W data_start   0804a0d0 b dtor_idx.7067   08048670 t frame_dummy   08048694 T main  

上面便是test这个程序中所有的符号,首先需要介绍一下上面的内容的格式:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/058a0ec07c325ad19d8c035d8039e97e.html