深入系統地了解system.map 文件

一、system.map文件

system.map 文件是Linux系統內核的一個重要文件,該文件記錄了系統運行時的大量信息。此文件包含了內核代碼符號表,指令地址、數據地址、BSS區地址等等信息。system.map 文件在內核構建時生成,其生成方式有多種。一個典型的system.map 文件包含類似於以下的信息:

c011d684 t reserve_bootmem
c011d68c t free_bootmem
c011d7e0 t pagetable_init
c011d8a8 t copy_kernel
c011d8c8 T copy_user
c011d8e0 T copy_to_user
c011d900 T copy_from_user
c011d920 T strcpy_from_user
c011d940 T strncpy_from_user
c011d960 T strlen_user

上述信息中每個符號的前6個字元是該符號的地址。其中t表示此符號是一個本地代碼符號,T表示此符號是一個可導出的代碼符號。

二、system.maplibraryname

Linux系統中的庫文件也會有對應的system.map 文件,其具有類似的作用。system.maplibraryname 用於指定庫文件名。

/lib/modules/2.6.9-55.ELsmp/kernel/fs/gfs/gfs.ko:
00000000 A gfs_lmhosts
00000000 A gfs_lockstate
00000000 A gfs_tune
00000000 A gfs_quota
00000000 A gfs_qrlock
00000000 A gfs_dir
00000000 A gfs_loghead
00000000 A gfs_quota_lock
00000000 A gfs_log_heads
00000000 A gfs_rindex
00000000 A jid_column
00000000 A dqblk_column
00000000 A inode_column
00000000 A timer_mgr

三、system.map在哪

系統默認位置 /boot/System.map-`uname -r`。

四、system.map 符號表

system.map 文件記錄了大量與內核代碼,內核模塊和系統所有符號相關的信息。其中符號表記錄每個符號的具體位置。這裡是一個示例:

c0008000 T _stext
c0008400 T __exception_table_start
c00084c4 T __exception_table_end
c0008520 T _sinittext
c007fb14 T _etext
c007fc3c T _sdata

表中列出了一些Linux內核的符號,包括起始地址(例如_stext)和結束地址(例如_etext),該地址是可執行文件中對應的代碼段的虛擬地址,T表示代碼符號,具有全局作用域。

五、system.map和module.symvers

對內核的開發人員而言,使用已經編譯的內核模塊和在內核源代碼中開發新模塊都是必要的。這裡有兩個文件是必備的

module.symvers是內核模塊的一個關鍵文件,如果缺失會導致編譯模塊時遇到問題。system.map 文件和 module.symvers 文件都包含符號表,它們的唯一區別在於生成方式不同。module.symvers 表示一個開發版本的內核,記錄了當前情況下所有可用的地址符號和其對應的版本信息。

六、system.map 查詢地址

可以使用符號名來查詢某個符號的地址,例如下面的命令查詢了符號init的地址:

$ grep '\' /boot/System.map-`uname -r`
c1041630 T init

七、system.map 解析地址

system.map 可以被用來查詢內核中的符號、函數、變數等等,這樣可以方便地進行內核分析、調試、編譯以及模塊的開發等工作。下面是一個如何解析與顯示符號的地址的例子:

#include
#include
int main()
{
    printf(「Address of getchar() function: %p\n」, getchar);
    printf(「Address of the read() function: %p\n」, read);
    return 0;
}

在shell裡面運行命令「make test」即可得到Address of getchar() function: xxxxxxxx,其中xxxx表示getchar 函數的地址。可以使用獲取到的函數地址進行代碼的調試、分析以及二進位文件的反彙編等多種操作。

八、總結

system.map 是Linux中一個很重要的內核文件。在操作系統的編譯過程中生成,它記錄了Linux內核中大量的相關信息,包括符號表和地址信息。system.map 文件和 module.symvers 文件都包含符號表,而它們的唯一區別在於生成方式不同。開發人員可以使用 system.map 文件來進行內核分析、調試、編譯以及模塊的開發等工作。了解 system.map 文件將對Linux內核的理解有很大幫助。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/155046.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-17 02:37
下一篇 2024-11-17 02:37

相關推薦

發表回復

登錄後才能評論