NM命令

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)即可

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一 常用腳本 1 打包腳本 腳本如下,下面附上ar 和 ranlib命令參考(命令來自于網(wǎng)絡(luò)) 2 更新靜態(tài)庫 使...
    火星來的農(nóng)民閱讀 13,642評論 0 4
  • nm命令 這個(gè)命令列出目標(biāo)文件的符號。如果沒有指定目標(biāo)文件,默認(rèn)是a.out。 命令參數(shù) 輸出格式 nm命令的輸出...
    visual_閱讀 5,738評論 0 3
  • 很多時(shí)候我們并不首要關(guān)注庫本身的實(shí)現(xiàn),或者根本無法看到其底層邏輯,但又必須確認(rèn)某些函數(shù)或變量的命名(如排查定義沖突...
    團(tuán)不慌閱讀 25,477評論 0 6
  • 在C語言中,五種基本數(shù)據(jù)類型存儲(chǔ)空間長度的排列順序是: A)char B)char=int<=float C)ch...
    夏天再來閱讀 4,036評論 0 2
  • 轉(zhuǎn)載請注明地址:涼鞋的筆記 為毛要實(shí)現(xiàn)這個(gè)工具???1.在我小時(shí)候,每當(dāng)游戲在真機(jī)運(yùn)行時(shí),我們看到的日志是這樣的。...
    光明程輝閱讀 710評論 0 0

友情鏈接更多精彩內(nèi)容