Linux System.map文件【轉】


轉自:http://blog.csdn.net/ysbj123/article/details/51233618

當運行GNU鏈接器gld(ld)時若使用了"-M"選項,或者使用nm命令,則會在標准輸出設備(通常是屏幕)上打印出鏈接映像(link map)信息,即是指由鏈接程序產生的目標程序內存地址映像信息。其中列出了程序段裝入到內存中的位置信息。具體來講有如下信息:

目標文件及符號信息映射到內存中的位置。

公共符號如何放置。

鏈接中包含的所有文件成員及其引用的符號。

通常我們會把發送到標准輸出設備的鏈接映像信息重定向到一個文件中(例如System.map)。在編譯內核時,Linux/Makefile文件產生的System.map文件就用於存放內核符號表信息。符號表是所有內核符號及其對應地址的一個列表,當然也包括上面說明的_etext、_edata和_end等符號的地址信息。隨着每次內核的編譯,就會產生一個新的對應System.map文件。當內核運行出錯時,通過System.map文件中的符號表解析,就可以查到一個地址值對應的變量名,或反之。

利用System.map符號表文件,在內核或相關程序出錯時,就可以獲得我們比較容易識別的信息。符號表的樣例如下所示:

c03441a0 B dmi_broken
c03441a4 B is_sony_vaio_laptop
c03441c0 b dmi_ident
c0344200 b pci_bios_present
c0344204 b pirq_table

其中每行說明一個符號,第1欄指明符號值(地址);第2欄是符號類型,指明符號位於目標文件的哪個區(sections)或其屬性;第3欄是對應的符號名稱。

第2欄中的符號類型指示符通常有表3-5所示的幾種,另外還有一些與采用的目標文件格式相關。如果符號類型是小寫字符,則說明符號是局部的;如果是大寫字符,則說明符號是全局的(外部的)。參見文件include/a.out.h中nlist{}結構n_type字段的定義(第110~185行)。

表3-5  目標文件符號列表文件中的符號類型

符號類型

名稱

說明

A

Absolute

符號的值是絕對值,並且在進一步鏈接過程中不會被改變

B

BSS

符號在未初始化數據區或區(section)中,即在BSS段中

C

Common

符號是公共的。公共符號是未初始化的數據。在鏈接時,多個公共符號可能具有同一名稱。如果該符號定義在其他地方,則公共符號被看作是未定義的引用

D

Data

符號在已初始化數據區中

G

Global

符號是在小對象已初始化數據區中的符號。某些目標文件的格式允許對小數據對象(例如一個全局整型變量)可進行更有效的訪問

I

Inderect

符號是對另一個符號的間接引用

N

Debugging

符號是一個調試符號

R

Read only

符號在一個只讀數據區中

S

Small

符號是小對象未初始化數據區中的符號

T

Text

符號是代碼區中的符號

U

Undefined

符號是外部的,並且其值為0(未定義)

-

Stabs

符號是a.out目標文件中的一個stab符號,用於保存調試信息

?

Unknown

符號的類型未知,或者與具體文件格式有關

可以看出名稱為dmi_broken的變量位於內核地址0xc03441a0處。

System.map位於使用它的軟件(例如內核日志記錄后台程序klogd)能夠尋找到的地方。在系統啟動時,如果沒有以一個參數的形式為klogd給出System.map的位置,則klogd將會在三個地方搜尋System.map。依次為:

/boot/System.map 
/System.map 
/usr/src/linux/System.map

盡管內核本身實際上不使用System.map,但其他程序,像klogd、lsof、ps以及dosemu等許多軟件都需要有一個正確的System.map文件。利用該文件,這些程序就可以根據已知的內存地址查找出對應的內核變量名稱,便於對內核的調試工作。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM