Linux 沒有定義的符號 調試方法 nm命令

來源:互聯網
上載者:User


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"將只列出已定義符號

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.