linux 下nm命令输出,NM命令

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

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

00000000000000c0 d _ee

U _printf

00000000000000a0 t _testFun

0000000000000000 T _testFunLocal

其实缩写而已,一一对应即可

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值