獲得核心函式地址的四種方法
阿新 • • 發佈:2021-10-25
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 所表示的字串的長度.