nm命令是linux中用來列出某些文件中的符號表的,是names的縮寫,可以針對oc,c++ ,c語言
nm有很多參數(shù),下面說幾個(gè)常用的參數(shù)
-m 顯示完整信息
-a,顯示所有符號,包括那些專門用來調(diào)試的符號。
-g,只顯示全局符號,不顯示局部符號。
-n,按照數(shù)字而不是默認(rèn)的字符排序。
-p,不排序,按照符號在符號表中出現(xiàn)的次序顯示。
-r,符號按照反序顯示(默認(rèn)就是按照符號名字字符排序的反序,如果帶上-p參數(shù)就是按照在符號表中出現(xiàn)次序的反序,如果帶上-n參數(shù)就是按照符號名數(shù)字排序的反序)。
-u,只顯示未定義的符號。
-U,不顯示未定義的符號,與-u的作用剛好相反。
-j,只顯示符號的名字,而不顯示符號對應(yīng)的數(shù)值和類型
下面來用nm命令來看下一個(gè)文件的符號表是什么樣的
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);
}
補(bǔ)充幾點(diǎn)知識,
1.一個(gè)目標(biāo)文件和可執(zhí)行文件結(jié)構(gòu)類似有以下部分組成
File Header 、 .text secton 、 .data secton 、 .bss secton 四大部分。 File Header是文件頭,描述整個(gè)文件的文件屬性,包括是否可執(zhí)行文件、目標(biāo)操作系統(tǒng)、目標(biāo)硬件等信息。文件頭還包括一個(gè)段表(Section Table)描述下面幾個(gè)段的偏移地址以及屬性。 .text section是代碼段,存放編譯生成的指令; .data section是數(shù)據(jù)段,存放已初始化的靜態(tài)常量數(shù)據(jù); .bss section存放未初始化的靜態(tài)常量
2.全局變量搭配static后,可分為2種
a外部變量:定義的變量能被本文件和外部文件訪問的變量。(默認(rèn)的全局變量就是外部變量)
b內(nèi)部變量:定義的變量只能被本件訪問,不能被其他文件訪問。(使用static修飾)
如:
static int a; 定義的全局變量只能在本文件中使用。
int a ; 定義的全局變量默認(rèn)就是外部變量。
加上關(guān)鍵字 extern int a; 意思就是 聲明了一個(gè)外部變量。
經(jīng)過編譯之后生成TestModuleA.c.o目標(biāo)文件,使用如下命令
nm -m TestModuleA.c.o結(jié)果如下
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表示全局變量,通過上面補(bǔ)充知識就可以理解nm -m的輸出含義,
aa是默認(rèn)全局變量,但是因?yàn)闆]有exter關(guān)鍵字,所以是定義了aa而不僅僅是聲明,它是由默認(rèn)值的,為0,
bb使用static修飾,非全局,但是因?yàn)樗鼪]有初始化,所以位于bss段
cc使用extern修改,而且初始化了,這里代表定義了一個(gè)全局的變量cc,所以位于data段
dd同bb
ee使用static修飾,非全局,但是因?yàn)樗跏蓟耍晕挥赿ata段
ff使用extern修改,但是因?yàn)樗鼪]有初始化,這里表示只是聲明了一個(gè)全局變量,并沒有定義,所以這里顯示undefined external
printf是系統(tǒng)函數(shù),這里只是調(diào)用,并不是定義,所以是 (undefined) external
_testFun和_testFunLocal是函數(shù),位于代碼段,一個(gè)是非全局的,一個(gè)是全局的
如果不加-m參數(shù)
nm TestModuleA.c.o那么輸出如下,請自行體會(huì)區(qū)別
0000000000000004 C _aa
00000000000006b0 b _bb
00000000000000b8 D _cc
00000000000006b8 b _dd
00000000000000c0 d _ee
U _printf
00000000000000a0 t _testFun
0000000000000000 T _testFunLocal
其實(shí)縮寫而已,一一對應(yīng)即可