nm命令
[
在GNU C語言庫提供的內容中,有介面可以用來做這件事。用下面的命令查看:
nm -D /lib/libc.so.6 | grep log
]
nm命令還是比較簡單而且強大的。它用來列出一個目標檔案中的各種符號。符號的種類很多,以下是一些常見的符號類型
nm輸出字元 |
含義 |
R |
Read only symbol. 比如在代碼中有一個const MAXDATA = 3095; 則MAXDATA就是一個Read only symbol |
N |
這是一個偵錯符號 |
D |
這是一個已經初始化的變數的符號。比如代碼中int i = 1和char *str = "Hello"則i和str都是這種類型的符號 |
T |
Text段的符號。子程式都是這種符號,比如檔案中實現了一個函數function,則function就是這種符號 |
U |
未定義的符號。如果檔案中引用了不存在的函數,則這些未定義的函數符號就是這種類型 |
S |
未初始化的符號,比如全域變數int s;則s的符號就是此類型 |
nm命令的詳細用法以及例子見本文。先來例子,以下是a.c的內容:
#include <stdio.h>
static int s_global;
int i = 1;
char *str = "hello, world";
const ID = 10;
extern int e_global;
void function()
{
printf("Hello");
}
int get_x()
{
int x;
x = 33;
return x;
}
在執行"gcc -g -O -c a.c"產生a.o之後,用"nm -A a.o"的輸出為:
a.o:00000000 R ID
a.o:00000000 T function
a.o:00000014 T get_x
a.o:00000000 D i
a.o: U printf
a.o:00000000 b s_global
a.o:00000004 D str
nm的用法
nm的用法很簡單,以下幾個關鍵字比較常用:
1、"-A",列出符號名的時候同時顯示來自於哪個檔案。
這在同時列出多個檔案(比如一個連結庫)的符號時比較有用
2、"-a",列出所有符號
這將會把偵錯符號也列出來。預設狀態下偵錯符號不會被列出。
3、"-l",列出符號在原始碼中對應的行號
指定這個參數後,nm將利用調試資訊找出檔案名稱以及符號的行號。對於一個已定義符號,將會找出這個符號定義的行號,對於未定義符號,顯示為空白
4、"-n",根據符號的地址來排序
預設是按符號名稱的字母順序排序的
5、"-u",只列出未定義符號
同"--undefined-only", 而"--defined-only"將只列出已定義符號