nm命令是linux中用来列出某些文件中的符号表的,是names的缩写,可以针对oc,c++ ,c语言
nm有很多参数,下面说几个常用的参数
-m 显示完整信息
-a,显示所有符号,包括那些专门用来调试的符号。
-g,只显示全局符号,不显示局部符号。
-n,按照数字而不是默认的字符排序。
-p,不排序,按照符号在符号表中出现的次序显示。
-r,符号按照反序显示(默认就是按照符号名字字符排序的反序,如果带上-p参数就是按照在符号表中出现次序的反序,如果带上-n参数就是按照符号名数字排序的反序)。
-u,只显示未定义的符号。
-U,不显示未定义的符号,与-u的作用刚好相反。
-j,只显示符号的名字,而不显示符号对应的数值和类型
下面来用nm命令来看下一个文件的符号表是什么样的
TestModuleA.c文件
include "TestModuleA.h"
include <stdio.h>
int aa;
static char *bb;
int cc=10;
static int *dd;
static int *ee=1;
extern int ff;
int testFun(int a, int b){
return a+b;
int testFunLocal(int a, int b){
printf("%d",aa);
printf("%s",bb);
printf("%d",cc);
printf("%d",dd);
printf("%d",ee);
printf("%d",ff);
return testFun(a,b);
补充几点知识,
1.一个目标文件和可执行文件结构类似有以下部分组成
File Header 、 .text secton 、 .data secton 、 .bss secton 四大部分。 File Header是文件头,描述整个文件的文件属性,包括是否可执行文件、目标操作系统、目标硬件等信息。文件头还包括一个段表(Section Table)描述下面几个段的偏移地址以及属性。 .text section是代码段,存放编译生成的指令; .data section是数据段,存放已初始化的静态常量数据; .bss section存放未初始化的静态常量
2.全局变量搭配static后,可分为2种
a外部变量:定义的变量能被本文件和外部文件访问的变量。(默认的全局变量就是外部变量)
b内部变量:定义的变量只能被本件访问,不能被其他文件访问。(使用static修饰)
static int a; 定义的全局变量只能在本文件中使用。
int a ; 定义的全局变量默认就是外部变量。
加上关键字 extern int a; 意思就是 声明了一个外部变量。
经过编译之后生成TestModuleA.c.o目标文件,使用如下命令
nm -m TestModuleA.c.o结果如下
0000000000000004 (common) (alignment 2^2) external _aa
00000000000006d8 (__DATA,__bss) non-external _bb
00000000000000d8 (__DATA,__data) external _cc
00000000000006e0 (__DATA,__bss) non-external _dd
00000000000000e0 (__DATA,__data) non-external _ee
(undefined) external _ff
(undefined) external _printf
00000000000000c0 (__TEXT,__text) non-external _testFun
0000000000000000 (__TEXT,__text) external _testFunLocal
其中0000000000000004表示符号的地址, external表示全局变量,通过上面补充知识就可以理解nm -m的输出含义,
aa是默认全局变量,但是因为没有exter关键字,所以是定义了aa而不仅仅是声明,它是由默认值的,为0,
bb使用static修饰,非全局,但是因为它没有初始化,所以位于bss段
cc使用extern修改,而且初始化了,这里代表定义了一个全局的变量cc,所以位于data段
dd同bb
ee使用static修饰,非全局,但是因为它初始化了,所以位于data段
ff使用extern修改,但是因为它没有初始化,这里表示只是声明了一个全局变量,并没有定义,所以这里显示undefined external
printf是系统函数,这里只是调用,并不是定义,所以是 (undefined) external
_testFun和_testFunLocal是函数,位于代码段,一个是非全局的,一个是全局的
如果不加-m参数
nm TestModuleA.c.o那么输出如下,请自行体会区别
0000000000000004 C _aa
00000000000006b0 b _bb
00000000000000b8 D _cc
00000000000006b8 b _dd