Linux的nm查看動態和靜態庫中的符號

來源:互聯網
上載者:User

功能

列出.o .a .so中的符號資訊,包括諸如符號的值,符號類型及符號名稱等。所謂符號,通常指定義出的函數,全域變數等等。

使用

nm [option(s)]

有用的options:

  • -A 在每個符號資訊的前面列印所在對象檔案名稱;
  • -C 輸出demangle過了的符號名稱;
  • -D 列印動態符號;
  • -l 使用對象檔案中的調試資訊列印出所在源檔案及行號;
  • -n 按照地址/符號值來排序;
  • -u 列印出那些未定義的符號;

常見的符號類型:

  • A 該符號的值在今後的連結中將不再改變;
  • B 該符號放在BSS段中,通常是那些未初始化的全域變數;
  • D 該符號放在普通的資料區段中,通常是那些已經初始化的全域變數;
  • T 該符號放在程式碼片段中,通常是那些全域非靜態函數;
  • U 該符號未定義過,需要自其他對象檔案中連結進來;
  • W 未明確指定的弱連結符號;同連結的其他對象檔案中有它的定義就用上,否則就用一個系統特別指定的預設值。

注意幾點:

  • -C 總是適用於c++編譯出來的對象檔案。還記得c++中有重載嗎?為了區分重載函數,c++編譯器會將函數傳回值/參數等資訊附加到函數名稱中去形成一個mangle過的符號,那用這個選項列出符號的時候,做一個逆操作,輸出那些原始的、我們可理解的符號名稱。
  • 使用 -l 時,必須保證你的對象檔案中帶有符號調式資訊,這一般要求你在編譯的時候指定一個 -g 選項,見 Linux:Gcc。
  • 使用nm前,最好先用Linux:File查看對象檔案所屬處理器架構,然後再用相應交叉版本的nm工具。

舉例

更詳細的內容見man page。這裡舉例說明:

nm -u hello.o
顯示hello.o 中的未定義符號,需要和其他對象檔案進行連結.
nm -A /usr/lib/* 2>/dev/null | grep "T memset"

在 /usr/lib/ 目錄下找出哪個庫檔案定義了memset函數. 

 

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.