linux下nm命令的基本使用以及輸出符號型別詳解

2021-10-08 03:29:40 字數 3318 閱讀 4178

輸出符號型別詳解

參考nm命令是linux下針對某些特定檔案的分析工具,能夠列出庫檔案(.a、.lib)、目標檔案(*.o)、可執行檔案的符號表。

-a-o--print-file-name:列印出每個符號屬於的檔案

-a--debug-syms:顯示除錯符號。

-b:等同於–format=bsd,用來相容mips的nm。

-c--demangle:將低階符號名解碼(demangle)成使用者級名字。這樣可以使得c++函式名具有可讀性。

-d--dynamic:顯示動態符號。該任選項僅對於動態目標(例如特定型別的共享庫)有意義。

-f forma--format=formatt:使用format格式輸出。format可以選取bsd、sysv或posix,該選項在gnu的nm中有用。預設為bsd。

-g--extern-only:僅顯示外部符號。

-n-v--numeric-sort:按符號對應位址的順序排序,而非按符號名的字元順序。

-p--no-sort:按目標檔案中遇到的符號順序顯示,不排序。

-p--portability:使用posix.2標準輸出格式代替預設的輸出格式。等同於使用任選項-f posix。

-s--print-armap:當列出庫中成員的符號時,包含索引。索引的內容包含:哪些模組包含哪些名字的對映。

-r--reverse-sort:反轉排序的順序(例如,公升序變為降序)。

--size-sort:按大小排列符號順序。該大小是按照乙個符號的值與它下乙個符號的值進行計算的。

-t radix--radix=radix:使用radix進製顯示符號值。radix只能為「d」表示十進位制、「o」表示八進位制或「x」表示十六進製制。

--target=bfdname:指定乙個目標**的格式,而非使用系統的預設格式。

-u--undefined-only:僅顯示沒有定義的符號(那些外部符號)。

-l--line-numbers:對每個符號,使用除錯資訊來試圖找到檔名和行號。對於已定義的符號,查詢符號位址的行號。對於未定義符號,查詢指向符號重定位入口的行號。如果可以找到行號資訊,顯示在符號資訊之後。

-v--version:顯示nm的版本號。

--help:顯示nm的任選項。

編寫原始檔test.c

#include

const

char ch =

'x';

int uninit;

int init =10;

void

function()

編譯test.c檔案 生成test.o

gcc -c test.c

u putchar

0000000000000000 r ch

0000000000000000 t function

0000000000000000 d init

0000000000000004 d sta_int.2182

0000000000000004 c uninit

符號型別說明a

該符號的值是絕對的,在以後的鏈結過程中,不允許進行改變。這樣的符號值,常常出現在中斷向量表中,例如用符號來表示各個中斷向量函式在中斷向量表中的位置。

b該符號的值出現在非初始化資料段(bss)中。例如,在乙個檔案中定義全域性static int test。則該符號test的型別為b,位於bss section中。其值表示該符號在bss段中的偏移。一般而言,bss段分配於ram中。

c該符號為common。common symbol是未初始話資料段。該符號沒有包含於乙個普通section中。只有在鏈結過程中才進行分配。符號的值表示該符號需要的位元組數。例如在乙個c檔案中,定義int test,並且該符號在別的地方會被引用,則該符號型別即為c。否則其型別為b。

d該符號位於初始話資料段中。一般來說,分配到data section中。例如定義全域性int baud_table[5] = ,則會分配於初始化資料段中。

g該符號也位於初始化資料段中。主要用於small object提高訪問small data object的一種方式。

i該符號是對另乙個符號的間接引用。

n該符號是乙個debugging符號。

r該符號位於唯讀資料區。例如定義全域性const int test = ;則test就是乙個唯讀資料區的符號。注意在cygwin下如果使用gcc直接編譯成mz格式時,原始檔中的test對應_test,並且其符號型別為d,即初始化資料段中。但是如果使用m6812-elf-gcc這樣的交叉編譯工具,原始檔中的test對應目標檔案的test,即沒有新增下劃線,並且其符號型別為r。一般而言,位於rodata section。值得注意的是,如果在乙個函式中定義const char *test = 「abc」, const char test_int = 3。使用nm都不會得到符號資訊,但是字串「abc」分配於唯讀儲存器中,test在rodata section中,大小為4。

s符號位於非初始化資料區,用於small object。

t該符號位於**區text section。

u該符號在當前檔案中是未定義的,即該符號的定義在別的檔案中。例如,當前檔案呼叫另乙個檔案中定義的函式,在這個被呼叫的函式在當前就是未定義的;但是在定義它的檔案中型別是t。但是對於全域性變數來說,在定義它的檔案中,其符號型別為c,在使用它的檔案中,其型別為u。

v該符號是乙個weak object。

w該符號是沒有被明確標記為weak object的弱符號型別。

-該符號是a.out格式檔案中的stabs symbol。

?該符號型別沒有定義。

nm命令中符號型別詳解

Linux 下ar命令和nm命令的使用方法

date 2017 4 18 author soaringlee 一 ar命令 功能說明 建立或修改備存檔案,或是從備存檔案中抽取檔案。語 法 ar dmpqrtx cfossuvv a 成員檔案 b 成員檔案 i 成員檔案 備存檔案 成員檔案 補充說明 ar可讓您集合許多檔案,成為單一的備存檔案。...

Linux 命令(1) nm 命令

nm是names的縮寫,nm命令主要是用來檢視檔案中的符號資訊。可以檢視的檔案包括 庫檔案 目標檔案 main.o 可執行檔案等。nm option file 如果未指定檔名,預設為a.out。a debug syms 這將會把除錯符號也列出來。預設狀態下除錯符號不會被列出。g extern onl...

ar和nm命令的使用

當我們的程式中有經常使用的模組,而且這種模組在其他程式中也會用到,這時按照軟體重用的思想,我們應該將它們生成庫,使得以後程式設計可以減少開發 量。這裡介紹兩個命令ar和nm,用來對庫操作。當我們的程式中有經常使用的模組,而且這種模組在其他程式中也會用到,這時按照軟體重用的思想,我們應該將它們生成庫,...