【Linux】一步一步学Linux——nm命令(250)
生活随笔
收集整理的這篇文章主要介紹了
【Linux】一步一步学Linux——nm命令(250)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
00. 目錄
文章目錄
- 00. 目錄
- 01. 命令概述
- 02. 命令格式
- 03. 常用選項
- 04. 參考示例
- 05. 附錄
01. 命令概述
nm命令被用于顯示二進制目標文件的符號表。
02. 命令格式
用法:nm [選項] [文件]03. 常用選項
如果沒有為nm命令指出目標文件,則nm假定目標文件是a.out。下面列出該命令的任選項,大部分支持“-”開頭的短格式和“—“開頭的長格式。 -A、-o或--print-file-name:在找到的各個符號的名字前加上文件名,而不是在此文件的所有符號前只出現文件名一次。-a或--debug-syms:顯示調試符號。 -B:等同于--format=bsd,用來兼容MIPS的nm。 -C或--demangle:將低級符號名解碼(demangle)成用戶級名字。這樣可以使得C++函數名具有可讀性。 -D或--dynamic:顯示動態符號。該任選項僅對于動態目標(例如特定類型的共享庫)有意義。 -f format:使用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的任選項。輸出符號類型說明
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] = {9600, 19200, 38400, 57600, 115200},則會分配于初始化數據段中。 G 該符號也位于初始化數據段中。主要用于small object提高訪問small data object的一種方式。 I 該符號是對另一個符號的間接引用。 N 該符號是一個debugging符號。 R 該符號位于只讀數據區。例如定義全局const int test[] = {123, 123};則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 The symbol is a weak symbol that has not been specifically tagged as a weak object symbol. - 該符號是a.out格式文件中的stabs symbol。 ? 該符號類型沒有定義04. 參考示例
4.1 顯示二進制目標文件的符號表
[deng@localhost bak]$ nm test 0000000000601024 B __bss_start 0000000000601024 b completed.6355 0000000000601020 D __data_start 0000000000601020 W data_start 0000000000400410 t deregister_tm_clones 0000000000400480 t __do_global_dtors_aux 0000000000600e18 t __do_global_dtors_aux_fini_array_entry 0000000000400568 R __dso_handle 0000000000600e28 d _DYNAMIC 0000000000601024 D _edata 0000000000601028 B _end 0000000000400554 T _fini 00000000004004a0 t frame_dummy 0000000000600e10 t __frame_dummy_init_array_entry 0000000000400690 r __FRAME_END__ 0000000000601000 d _GLOBAL_OFFSET_TABLE_w __gmon_start__ 0000000000400570 r __GNU_EH_FRAME_HDR 0000000000400390 T _init 0000000000600e18 t __init_array_end 0000000000600e10 t __init_array_start 0000000000400560 R _IO_stdin_used 0000000000600e20 d __JCR_END__ 0000000000600e20 d __JCR_LIST__ 0000000000400550 T __libc_csu_fini 00000000004004e0 T __libc_csu_initU __libc_start_main@@GLIBC_2.2.5 00000000004004cd T main 0000000000400440 t register_tm_clones 00000000004003e0 T _start 0000000000601028 D __TMC_END__ [deng@localhost bak]$05. 附錄
參考:【Linux】一步一步學Linux系列教程匯總
總結
以上是生活随笔為你收集整理的【Linux】一步一步学Linux——nm命令(250)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Linux】一步一步学Linux——g
- 下一篇: 【Linux系统编程】Linux系统调用