nm用於列出程式檔案中的符號。建立nmtest.c檔案:
1 #include23int
global1; 4
int global2=3;
56static
intstatic_global1; 7
static
int static_global2=3;
89void
foo() 10
1516static
void
bar() 17
2021int main(void)
22執行 gcc -g -c nmtest.c
然後
nm的第一列是指程式執行時符號在記憶體中的位址,它表示函式或變數的開始位址;第二列是指相應的符號放在哪個段,最後一列則是符號的名稱。
第二列的資訊對我們非常有用,可以讓我了解在程式中所定義的乙個符號是被放在程式的哪乙個段的。下面列出常見字母含義(更多詳情man):
上面nm的結果顯示,存在位址為0的符號,此時列出的位址由於程式還沒完成鏈結,所以是指符號在對應段中的相對偏移位置。另外,還可以看出time符號沒有定義,因為它在c標準庫libc.a內。由上可得結論:
無論靜態變數是否初始化,程式段的分配方式都是一樣的(都在資料段),初始化的靜態變數會被分配到.data段中,否則分配在.bss段中;
非靜態的全域性變數所分配的段只與其是否初始化有關。初始化了則分配在.data段,否則分配在.bss段;
函式無論是靜態還是非靜態的,總是分配在.test段中,小寫t表示靜態函式,大寫t表示非靜態。
函式內的區域性變數由於是分配在棧上的,所以在nm中看不到他們的身影。
man是個查詢指令的強大工具~~~
執行gcc -g nmtest.c -o test
nm -n test
發現global1的變數的分配空間從前面的c變成了b,time符號從無定義變成了分配在.test段中。
nm命令:
選項/屬性:
-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的任選項
binutils工具集之 nm
nm用於列出程式檔案中的符號。建立nmtest.c檔案 1 include2 3int global1 4 int global2 3 56static intstatic global1 7 static int static global2 3 89void foo 10 1516static ...
binutils工具集用法
addr2line用於得到程式指令位址所對應的函式,以及函式所在的源檔名和行號。在不少嵌入式開發環境中,編譯器的名稱往往不是gcc,而是想arm rtems gcc這樣的,對於這種命名形式的編譯器,讀者通常可以找到arm rtems addr2line arm rtems objdump等相應名稱的...
gcc glibc和binutils模組之間的關係
一 關於gcc glibc和binutils模組之間的關係 1 gcc gnu collect compiler 是一組編譯工具的總稱。它主要完成的工作任務是 預處理 和 編譯 以及提供了與編譯器緊密相關的執行庫的支援,如libgcc s.so libstdc so等。2 binutils提供了一系...