功能
nm是names的簡稱,通過該指令可以列舉文件中的符號(一般是庫文件),因爲很多時候我們並不首要關注庫邏輯實現,只需要知道某些函數或變量的命名衝突等問題,這個時候就可以使用nm命令,當然,類似的命令還有其他的,這裏我只講nm。
Usage: nm [option(s)] [file(s)]
List symbols in [file(s)] (a.out by default).
The options are:
-a, --debug-syms 只顯示調試信息
-A, --print-file-name 在每行符號信息前,打印查詢的文件名
-C, --demangle[=STYLE] 將低級別的符號名稱轉換爲用戶級別的名稱,意思是轉換爲用戶較容易理解的形式
-D, --dynamic 顯示動態符號信息
-f, --format=FORMAT 設置信息輸出格式. 它可以是`bsd',`sysv' 或者 `posix'. 默認爲 `bsd'
-g, --extern-only 只顯示外部符號;封裝成動態庫時,需要被外部調用的函數必須是外部符號,否則無法使用
-l, --line-numbers 顯示每個符號的文件名和行號
-n, --numeric-sort 將符號按地址排序
-r, --reverse-sort 反向排序
-S, --print-size 顯示定義符號的大小
-u, --undefined-only 僅顯示未定義符號
-X 32_64 (ignored)
一般顯示格式
值(the symbol value)、類型(the symbol type)、名字(the symbol name)
類型
nm 將找到的符號值使用十六進制缺省表示,並在函數前添加其類型,類型主要有:
值 | 描述 |
---|---|
A | 符號絕對,鏈接過程不允許被改變 |
B/b | 非初始化符號,出現在bss段中 |
C | 公有符號,鏈接時會被同名符號覆蓋 |
D/d | 初始化符號 |
G/g | 初始化符號,面向小數據訪問優化 |
I | 其它符號的間接引用 |
N | 調試符號 |
P | 棧區符號(清空) |
R/r | 符號只讀 |
S/s | 非初始化符號,面向小數據訪問優化 |
T/t | 代碼區符號 |
U | 未定義或在外部定義的符號 |
u | 全局唯一,GNU保留符 |
V/v | 弱定義符(詳見C++強弱符號定義) |
W/w | 弱符號,但是還沒有被弱對象定義 |
- | stabs格式符號 |
? | 無法識別的符號 |