1.nm工具作用
nm工具列出.o文件、.a文件、.so文件等的符号信息,包括诸如符号的值,符号类型及符号名称等。所谓符号,通常指定义出的函数,全局变量等等。
2.nm的使用方法
nm [option] filename
例如,nm -C a.out
常用的选项有:
-A 打印出来的每个符号所属的对象文件的名称
-C 使用nm工具打印出来的符号名称看不懂,使用-C选项后就可以看懂了。
3.使用举例
源程序main.c为:
#include "stdio.h"使用gcc main.c -o main后生成名称为main的可执行文件。
int cc = 4;
int func_1(){
int a = 4;
int b = 3;
int c = a + b;
}
int main(){
int stack_of[100000000];
int b=1;
int* a;
*a=b;
}
<span style="color:#660000;">#nm -C main
000000000050087c A __bss_start
00000000004003dc t call_gmon_start
0000000000500878 D </span><span style="color:#ff0000;">cc</span><span style="color:#660000;">
000000000050087c b completed.1
0000000000500688 d __CTOR_END__
0000000000500680 d __CTOR_LIST__
0000000000500860 D __data_start
0000000000500860 W data_start
0000000000400550 t __do_global_ctors_aux
0000000000400400 t __do_global_dtors_aux
0000000000500868 D __dso_handle
0000000000500698 d __DTOR_END__
0000000000500690 d __DTOR_LIST__
00000000005006a8 D _DYNAMIC
000000000050087c A _edata
0000000000500880 A _end
0000000000400588 T _fini
0000000000500680 A __fini_array_end
0000000000500680 A __fini_array_start
0000000000400440 t frame_dummy
0000000000400678 r __FRAME_END__
0000000000400468 T func_1
0000000000500840 D _GLOBAL_OFFSET_TABLE_
w __gmon_start__
0000000000400370 T _init
0000000000500680 A __init_array_end
0000000000500680 A __init_array_start
0000000000400598 R _IO_stdin_used
00000000005006a0 d __JCR_END__
00000000005006a0 d __JCR_LIST__
w _Jv_RegisterClasses
0000000000400510 T __libc_csu_fini
00000000004004b0 T __libc_csu_init
U __libc_start_main@@GLIBC_2.2.5
0000000000400485 T </span><span style="color:#ff0000;">main</span><span style="color:#660000;">
0000000000500870 d p.0
0000000000500680 A __preinit_array_end
0000000000500680 A __preinit_array_start
00000000004003b0 T _start</span>
在上图结果输出中,第一列是符号的值,一般表示内存偏移量,但要视具体的符号类型来决定。第二列时符号的类型,具体各种类型的含义可以参见man nm。第三列是符号名称,例如上面飘红的就是我们定义的全局函数和全局变量的名称。