0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

四種獲取內(nèi)核函數(shù)地址的方法

CHANBAEK ? 來源:嵌入式Linux充電站 ? 作者: Vincent ? 2023-11-17 16:58 ? 次閱讀

圖片

在內(nèi)核調(diào)試中,經(jīng)常需要知道某個函數(shù)的地址,或者根據(jù)函數(shù)地址找到對應的函數(shù),從而進行更深一步的debug。

下面介紹四種獲取內(nèi)核函數(shù)地址的方法:

1、System.map

在編譯Linux內(nèi)核時,會產(chǎn)生一個內(nèi)核映像文件System.map,也叫 內(nèi)核符號表 。

內(nèi)核符號表是一個映射,它將內(nèi)核代碼段中的地址映射到對應的函數(shù)名或全局變量名。

System.map文件中,每一行都包含一個內(nèi)核符號,每個符號包含三部分:

  • 地址 :符號在內(nèi)核內(nèi)存中的地址。
  • 類型 :符號的類型。例如,"T"表示該符號是一個在代碼段中的函數(shù)。
  • 名稱 :符號的名字,可以是函數(shù)名或者變量名。

例如,我們要查找名為“do_fork”的函數(shù)的地址,可以使用以下命令:

grep ' do_fork' System.map

然后會得到類似于這樣的輸出:

c0105020 T do_fork

這代表,c0105020就是函數(shù)do_fork的地址,T代表該符號是個函數(shù)。

或者,直接打開System.map搜索對應函數(shù)名或者地址。System.map內(nèi)容類似如下:

c0004000 A swapper_pg_dir
c0008000 T __init_begin
c0008000 T _sinittext
c0008000 T _stext
c0008000 T stext
c0008034 t __enable_mmu
c0008060 t __turn_mmu_on
......

A、T、t等都代表不同的類型,具體類型的定義可參考:

類型說明
A該符號的值是不能改變的,等于const
B該符號來自于未初始化代碼段bss段
C該符號是通用的,通用的符號指未初始化的數(shù)據(jù)。當鏈接時,多個通用符號可能對應一個名稱,如果該符號在某一個位置定義,這個通用符號被當做未定義的引用。不明白,內(nèi)核中也沒有該類型的符號
D該符號位于初始化的數(shù)據(jù)段
G位于初始化數(shù)據(jù)段,專門對應小的數(shù)據(jù)對象,比如global int x,對應的大數(shù)據(jù)對象為 數(shù)組類型等
I到其他符號的間接引用,是對于a.out文件的GNU擴展,使用非常少
N調(diào)試符號
R只讀代碼段的符號
SBSS段(未初始化數(shù)據(jù)段)的小對象符號
T代碼段符號,全局函數(shù),t為局部函數(shù)
U未定義的符號
V該符號是一個weak object,當其連接到為定義的對象上上,該符號的值變?yōu)?
W類似于V
-該符號是a.out文件中的一個stabs symbol,獲取調(diào)試信息
?未知類型的符號

2、vmlinux

vmlinux也是Linux編譯出來的內(nèi)核映像文件,可以通過nm、objdumpreadelf等工具來查看它的符號表,從而獲取函數(shù)地址。

2.1 nm讀取vmlinux

nm命令是用于查看二進制文件(如可執(zhí)行文件、目標文件、庫)的符號表的工具,所以可以用nm命令來讀取vmlinux里的符號表。

  • nm查找vmlinux中函數(shù)名為do_fork的地址:
nm vmlinux | grep "do_fork"
  • nm查找vmlinux中地址為c0105020的符號:
nm vmlinux | grep c0105020

nm命令的輸出,與System.map類似,會的得到類似于以下的輸出:

c0105020 T do_fork

2.2 objdump反匯編vmlinux

objdump工具用于反匯編,可以將vmlinux反匯編出來,得到的反匯編文件就會包含函數(shù)名和對應的 地址 ,可以直接查看文本內(nèi)容。

  • 使用objdump查看vmlinux函數(shù)地址
objdump -d vmlinux | grep "函數(shù)名"

這會返回與指定函數(shù)名匹配的符號的地址、類型和名稱。objdump-d選項表示反匯編代碼。

也可以將vmlinux的內(nèi)容全部反匯編出來,重定向到一個文件,然后直接查看文本內(nèi)容:

objdump -D vmlinux > vmlinux_dump.txt

上述命令會將vmlinux所有內(nèi)容反匯編,并將結果輸出到vmlinux_dump.txt文件中,-D表示反匯編所有代碼段。

2.3 readelf讀取vmlinux

使用readelf也可以讀取vmlinux的符號表,命令如下:

readelf -s vmlinux

由于vmlinux比較大,如果要查找某個函數(shù)的地址,需要使用grep進行過濾。

例如,找到do_fork函數(shù)的地址,你可以使用以下命令:

readelf -s vmlinux | grep "do_fork"

然后,你就會看到類似這樣的輸出:

56481: c10601e0    96 FUNC    GLOBAL DEFAULT    1 do_fork

輸出內(nèi)容表示,do_fork函數(shù)的地址是c10601e0。

3、/proc/kallsyms

vmlinux是編譯時生成的,假設你沒有vmlinux這個文件,只有正在運行的Linux系統(tǒng),此時也可以通過/proc/kallsyms獲取函數(shù)地址。

/proc/kallsyms是一個由運行中的 內(nèi)核動態(tài)生成的虛擬文件 ,它反映了 當前運行的內(nèi)核的狀態(tài) 。

通常這個節(jié)點是不會打開的,因為會增加內(nèi)核大小,要使用這個節(jié)點,需要打開內(nèi)核選項:

CONFIG_KALLSYMS=y

如果想獲取do_fork函數(shù)的地址,可以使用以下命令:

cat /proc/kallsyms | grep " do_fork"

然后會返回一個包含do_fork函數(shù)地址的行,如:

ffffffff810b57b0 T do_fork

輸出內(nèi)容表示do_fork函數(shù)的地址是ffffffff810b57b0。

4、內(nèi)核接口

也可以在代碼中獲取內(nèi)核符號表,同樣需要打開內(nèi)核選項CONFIG_KALLSYMS=y。

kallsyms_lookup_name

  • 已知函數(shù)名,獲取地址:
kallsyms_lookup_name("函數(shù)名" )

該函數(shù)會返回對應函數(shù)名的地址。

sprint_symbol

  • 已知地址,返回對應符號:
#include < linux/kallsyms.h >

int sprint_symbol(char *buffer, unsigned long address)
  • buffer:符號名緩存區(qū),保存結果。
  • address:符號地址。
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 內(nèi)核
    +關注

    關注

    3

    文章

    1336

    瀏覽量

    40084
  • Linux
    +關注

    關注

    87

    文章

    11123

    瀏覽量

    207919
  • 調(diào)試
    +關注

    關注

    7

    文章

    551

    瀏覽量

    33763
  • 函數(shù)
    +關注

    關注

    3

    文章

    4237

    瀏覽量

    61969
收藏 人收藏

    評論

    相關推薦

    四種模擬輸入信號的保護電路實現(xiàn)方法

    本文介紹了四種模擬輸入信號的保護電路的實現(xiàn)方法
    發(fā)表于 03-28 09:55 ?1038次閱讀

    FPGA 設計的四種常用思想與技巧

    FPGA 設計的四種常用思想與技巧FPGA設計的四種常用思想與技巧 討論的四種常用FPGA/CPLD設計思想與技巧:乒乓操作、串并轉換、流水線操作、數(shù)據(jù)接口同步化,都是FPGA/CPLD 邏輯設計
    發(fā)表于 08-11 10:30

    請問MATHLIB的庫函數(shù)為什么每個都有四種?有什么區(qū)別?

    mathlib_c66x_3_0_1_1:請問大神們,MATHLIB的庫函數(shù)為什么每個都有四種?比如說單精度的Atansp就有這四種:(1)floatatansp(float a)(2
    發(fā)表于 07-24 07:39

    IO口的四種使用方法

    IO口的四種使用方法高阻態(tài)的典型應用
    發(fā)表于 01-12 07:16

    IO口的四種使用方法

    IO口的四種使用方法高阻態(tài)的典型應用
    發(fā)表于 02-02 06:58

    IO口的四種使用方法

    IO口的四種使用方法高阻態(tài)的典型應用
    發(fā)表于 02-19 07:23

    Word技巧:快速實現(xiàn)雙面打印的四種方法

    Word技巧:快速實現(xiàn)雙面打印的四種方法 在日常辦公中要求對文檔進行雙面打印是很常見的,在打印機沒有自帶雙面打印功能的情況下,
    發(fā)表于 12-29 10:31 ?1563次閱讀

    教你四種神奇的電腦開機方法

    教你四種神奇的電腦開機方法 如果有人問你,你的電腦怎么開機?回答不外乎是:“直接按電腦機箱上的電源開關按鈕不就得了”。這當然是最簡
    發(fā)表于 02-23 15:20 ?980次閱讀

    如何延長iPhone的壽命 告訴你四種方法

    本文主要介紹了如何延長iPhone壽命的四種簡單方法,具體的跟隨小編一起來了解一下。
    的頭像 發(fā)表于 03-31 07:19 ?7248次閱讀

    四種特殊的線路板電鍍方法

    本視頻主要詳細介紹了四種特殊的線路板電鍍方法,分別是指排式電鍍、通孔電鍍、卷輪連動式選擇鍍、刷鍍。
    的頭像 發(fā)表于 05-28 17:42 ?5652次閱讀

    直流電阻測試儀的四種使用方法

    本文主要闡述了直流電阻測試儀的四種使用方法。
    發(fā)表于 10-24 10:41 ?1.4w次閱讀

    四種常用的諧波治理方法

    綠+波杰能從事諧波治理20余年,結合自己20多年的從業(yè)經(jīng)驗,以及相關的資料、研究,綠+波杰能將諧波治理的基本方法進行了總結,與大家一同探討之。綠+波杰能常用的諧波治理的基本方法,有以下四種
    發(fā)表于 03-01 16:09 ?1.2w次閱讀

    改善您的模數(shù)轉換器系統(tǒng)電源抑制狀況的四種方法

    改善您的模數(shù)轉換器系統(tǒng)電源抑制狀況的四種方法
    發(fā)表于 11-04 09:51 ?1次下載
    改善您的模數(shù)轉換器系統(tǒng)電源抑制狀況的<b class='flag-5'>四種方法</b>

    四種方法實現(xiàn)LED點亮

    四種方法實現(xiàn)LED點亮程序分享
    發(fā)表于 12-28 10:03 ?3次下載

    干貨 | 數(shù)字萬用表四種妙用方法,你知道么?

    干貨 | 數(shù)字萬用表四種妙用方法,你知道么?
    的頭像 發(fā)表于 01-05 09:52 ?990次閱讀