nm命令中符号类型详解
nm命令介紹的很多,但大多不介紹其函數符號標志的含義。
最近在調試動態庫時常用到,其中用的最多的用法:
nm -A * |grep “aaa” | c++filt? // -A 為了顯示文件, c++filt轉換為可讀風格,好像有個參數也能實現類似功能
其他內容整理如下(原作者未知):
nm用于列出目標文件的符號清單,如果沒有指定目標文件,則默認為“a.out”。nm的格式如下:
nm?[‘-a’|‘--debug-syms’] [‘-g’|‘--extern-only’]
???????? [‘-B’] [‘-C’|‘--demangle’[=style]] [‘-D’|‘--dynamic’]
???????? [‘-S’|‘--print-size’] [‘-s’|‘--print-armap’]
???????? [‘-A’|‘-o’|‘--print-file-name’][‘--special-syms’]
???????? [‘-n’|‘-v’|‘--numeric-sort’] [‘-p’|‘--no-sort’]
???????? [‘-r’|‘--reverse-sort’] [‘--size-sort’] [‘-u’|‘--undefined-only’]
???????? [‘-t’ radix|‘--radix=’radix] [‘-P’|‘--portability’]
???????? [‘--target=’bfdname] [‘-f’format|‘--format=’format]
???????? [‘--defined-only’] [‘-l’|‘--line-numbers’] [‘--no-demangle’]
????????[‘-V’|‘--version’] [‘-X 32_64’] [‘--help’] [objfile...]
??
對于每一個符號,nm列出其值(the symbol value),類型(the symbol type)和其名字(the symbol name)。
如下例:
??
???? 00000024 T cleanup_before_linux
???? 00000018 T cpu_init
?????00000060 T dcache_disable
?????00000054 T dcache_enable
???? 0000006c T dcache_status
???? 00000000 T do_reset
???? 0000003c T icache_disable
???? 00000030 T icache_enable
???? 00000048 T icache_status
?
上面的顯示是使用nm?cpu.o的輸出,對于cleanup_before_linux這個符號來說,00000024是以16進制顯示的其值,T為其類型,而cleanup_before_linux是其名字。可以看出,上面顯示的cleanup_before_linux這個symbol的值實際上是該函數在text section中的偏移。但是,每個符號的值的具體含義依其類型而異。當然,對于每個符號的值,其類型、其值以及它們所屬的section是密切相關的。
下面說明符號類型:對于每一個符號來說,其類型如果是小寫的,則表明該符號是local的;大寫則表明該符號是global(external)的。
?
|
總結
以上是生活随笔為你收集整理的nm命令中符号类型详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 编译器构造概述(详细)
- 下一篇: 析构函数virtual与非virtual