nm命令是linux中用來列出某些文件中的符號表的辨液,是names的縮寫靠瞎,可以針對oc,c++ 唉工,c語言
nm有很多參數研乒,下面說幾個常用的參數
-m 顯示完整信息
-a,顯示所有符號淋硝,包括那些專門用來調試的符號雹熬。
-g,只顯示全局符號谣膳,不顯示局部符號橄唬。
-n,按照數字而不是默認的字符排序参歹。
-p,不排序隆判,按照符號在符號表中出現(xiàn)的次序顯示犬庇。
-r,符號按照反序顯示(默認就是按照符號名字字符排序的反序侨嘀,如果帶上-p參數就是按照在符號表中出現(xiàn)次序的反序臭挽,如果帶上-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.一個目標文件和可執(zhí)行文件結構類似有以下部分組成
File Header 扒吁、 .text secton 、 .data secton 室囊、 .bss secton 四大部分雕崩。 File Header是文件頭,描述整個文件的文件屬性融撞,包括是否可執(zhí)行文件盼铁、目標操作系統(tǒng)、目標硬件等信息尝偎。文件頭還包括一個段表(Section Table)描述下面幾個段的偏移地址以及屬性饶火。 .text section是代碼段,存放編譯生成的指令冬念; .data section是數據段趁窃,存放已初始化的靜態(tài)常量數據; .bss section存放未初始化的靜態(tài)常量
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是系統(tǒng)函數金砍,這里只是調用,并不是定義麦锯,所以是 (undefined) external
_testFun和_testFunLocal是函數恕稠,位于代碼段,一個是非全局的扶欣,一個是全局的
如果不加-m參數
nm TestModuleA.c.o那么輸出如下鹅巍,請自行體會區(qū)別
0000000000000004 C _aa
00000000000006b0 b _bb
00000000000000b8 D _cc
00000000000006b8 b _dd
00000000000000c0 d _ee
U _printf
00000000000000a0 t _testFun
0000000000000000 T _testFunLocal
其實縮寫而已,一一對應即可