1. 程式人生 > 其它 >獲得核心函式地址的四種方法

獲得核心函式地址的四種方法

1.從 System.map 檔案中直接得到地址

核心映象的 System.map 檔案儲存了核心符號表的資訊, 可以通過此檔案獲取到具體的資訊

檢視核心函式的地址

grep perf_trace_do_sys_open /boot/System.map-4.4.0-72-generic

檢視地址對應哪個核心函式

grep ffffffff811fdb90 /boot/System.map-4.4.0-72-generic

2.使用 nm 命令讀取 vmlinux 的資訊

nm /usr/lib/debug/boot/vmlinux-4.4.0-72-generic | grep perf_trace_do_sys_open

nm /usr/lib/debug/boot/vmlinux-4.4.0-72-generic | grep ffffffff811fdb90

3.從 /proc/kallsyms 檔案獲得地址

cat /proc/kallsyms | grep perf_trace_do_sys_open

cat /proc/kallsyms | grep ffffffff811fdb90

4.使用核心函式介面

已知核心符號,獲取核心符號地址,使用 kallsyms_lookup_name( )

該函式在 kernel/kallsyms.c 檔案中定義的, 要使用它必須啟用 CONFIG_KALLSYMS 編譯核心.

kallsyms_lookup_name( ) 接受一個字串格式核心函式名, 返回那個核心函式的地址.

kallsyms_lookup_name("函式名");

已知核心符號地址, 獲取核心符號名,使用 sprint_symbol 核心函式

#include <linux/kallsyms.h>

int sprint_symbol(char *buffer, unsigned long address)
``
函式功能描述 :

該函式根據一個記憶體中的地址 address 查詢一個核心符號, 並將該符號的基本資訊, 如符號名 name, 它在核心符號表中的偏移 offset 和大小 size, 所屬的模組名(如果有的話)等資訊連線成字串賦值給文字緩衝區 buffer. 其中所查詢的核心符號可以是原本就存在於核心中的符號, 也可以是位於動態插入的模組中的符號.

輸入引數說明

|引數|	說明|
|--|--|
|buffer	|文字緩衝區, 它用來記錄核心符號的資訊, 它是一個輸出型引數|
|address |	核心符號中的某一地址, 為輸入型引數|

返回引數說明:返回值是一個 int 型, 它表示核心符號基本資訊串的長度, 也即是 buffer 所表示的字串的長度.