Linux 命令(1) nm 命令

2021-10-06 05:47:48 字數 3417 閱讀 8442

nm是names的縮寫, nm命令主要是用來檢視檔案中的符號資訊。可以檢視的檔案包括:庫檔案、目標檔案(main.o)、可執行檔案等。

nm [-option]

file

## 如果未指定檔名,預設為a.out。

[-a|--debug-syms]

## 這將會把除錯符號也列出來。預設狀態下除錯符號不會被列出。

[-g|--extern-only]

## 只顯示外部符號

[-b]

[-c|--demangle[

=style]

][-d|--dynamic]

[-s|--print-size]

[-s|--print-armap]

[-a|-o|--print-file-name]

## 列出符號名的時候同時顯示來自於哪個檔案,這在同時列出多個檔案(比如乙個鏈結庫)的符號時比較有用

[-n|-v|--numeric-sort]

## 根據符號的位址來排序 預設是按符號名稱的字母順序排序的

[-p|--no-sort]

[-r|--reverse-sort]

[--size-sort]

[-u|--undefined-only]

## 只顯示未定義的符號

[-t radix|--radix=radix]

## 符號值得進製。d 十進位制, o 八進位制, x 十六進製制.

[-p|--portability]

[--target=bfdname]

[-fformat|--format=format]

## 輸出的格式,有"bsd","sysv" 或"posix"可選。預設是「bsd」

[--defined-only]

## 只顯示已定義的符號.

[-l|--line-numbers]

## 列出符號在源**中對應的行號 指定這個引數後,nm將利用除錯資訊找出檔名以及符號的行號。對於乙個已定義符號,將會找出這個符號定義的行號,對於未定義符號,顯示為空

[--no-demangle]

## demangle 的中文含義是「解構,還原函式」。符號解析(symbol demangling)

## mangle 的中文含義是「破壞,撕裂」。在編譯過程中,會破壞原來的格式,變為一種不利於人類閱讀的格式。該過程即為「mangle」。

[-v|--version]

[-x 32_64]

[--help]

[objfile...]

## 1、檢視動態庫中是否包含 funca 函式

nm lib_tst.so |

grep -i "funca"

u dyld_stub_binder

u _objc_storestrong

u _objc_retainautoreleasedreturnvalue

u _objc_retain

u _objc_release

u _objc_msgsend

u _objc_autoreleasereturnvalue

0000000000007cf8 t _checkname

u __objc_empty_cache

u ___cfconstantstringclassreference

00000000000084d8 s _objc_metaclass_$_willexistmodel

u _objc_metaclass_$_nsobject

00000000000083e8 s _objc_metaclass_$_module1

0000000000008438 s _objc_metaclass_$_existmodel3

0000000000008398 s _objc_metaclass_$_existmodel2

0000000000008488 s _objc_metaclass_$_existmodel1

0000000000008500 s _objc_class_$_willexistmodel

u _objc_class_$_nsstring

u _objc_class_$_nsobject

0000000000008410 s _objc_class_$_module1

0000000000008460 s _objc_class_$_existmodel3

00000000000083c0 s _objc_class_$_existmodel2

00000000000084b0 s _objc_class_$_existmodel1

u _nsstringfromselector

0000000000007f80 s _mtg_module1versionstring

0000000000007fb0 s _mtg_module1versionnumber

0000000000007d54 t -[module1 modulestyle1:]

nm命令的輸出包含三個部分:

符號值。預設顯示十六進製制,也可以指定其它進製;

符號型別。小寫表示是本地符號,大寫表示全域性符號(external);

符號名稱。

a:  符號值是絕對的。在進一步的連線中,不會被改變。

b: 符號位於未初始化資料段(known as bss).

c: 共用(common)符號. 共用符號是未初始化的資料。在連線時,多個共用符號可能採用乙個同樣的名字,如果這個符號在某個地方被定義,共用符號被認為是未定義的引用.

d: 已初始化資料段的符號

g: 已初始化資料段中的小目標(small objective)符號. 一些目標檔案格式允許更有效的訪問小目標資料,比如乙個全域性的int變數相對於乙個大的全域性陣列。

i: 其他符號的直接應用,這是gnu擴充套件的,很少用了.

n: 除錯符號.

r: 唯讀資料段符號.

s: 未初始化資料段中的小目標(small object)符號.

t: **段的符號.

u: 未定義符號.

v: 弱物件(weak object)符號. 當乙個已定義的弱符號被連線到乙個普通定義符號,普通定義符號可以正常使用,當乙個未定義的弱物件被連線到乙個未定義的符號,弱符號的值為0.

w: 乙個沒有被指定乙個弱物件符號的弱符號(weak symbol)。

-: a.out目標檔案中的刺符號(stabs symbol). 這種情況下,列印的下乙個值是其他字段,描述字段,和型別。刺符號用於保留除錯資訊.

?: 未知符號型別,或者目標檔案特有的符號型別.

nm命令介紹

nm命令 它用來列出乙個目標檔案中的各種符號。nm命令還是比較簡單而且強大的。它用來列出乙個目標檔案中的各種符號。符號的種類很多,以下是一些常見的符號型別 nm輸出字元含義r read only symbol.比如在 中有乙個const maxdata 3095 則maxdata就是乙個read o...

ar命令和nm命令

2008 11 19 09 49 ar create,modify and extract from archive nm list symbol from obj files 可以檢視動態庫中都有些什麼函式 當我們的程式中有經常使用的模組,而且這種模組在其他程式中也會用到,這時按照軟體重用的思想,...

AR命令和NM命令

ar create,modify and extract from archive nm list symbol from obj files 可以檢視動態庫中都有些什麼函式 當我們的程式中有經常使用的模組,而且這種模組在其他程式中也會用到,這時按照軟體重用的思想,我們應該將它們生成庫,使得以後程式...