輸出符號型別詳解
參考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,用來對庫操作。當我們的程式中有經常使用的模組,而且這種模組在其他程式中也會用到,這時按照軟體重用的思想,我們應該將它們生成庫,...