天天看點

nm指令介紹先來例子,以下是a.c的内容:nm的用法

nm指令

轉自:http://www.hsboy.com/blog/archives/116-guid.html 它用來列出一個目标檔案中的各種符号。

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"将隻列出已定義符号

繼續閱讀