精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

3天內不再提示

四種獲取內核函數地址的方法

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

圖片

在內核調試中,經常需要知道某個函數的地址,或者根據函數地址找到對應的函數,從而進行更深一步的debug。

下面介紹四種獲取內核函數地址的方法:

1、System.map

在編譯Linux內核時,會產生一個內核映像文件System.map,也叫 內核符號表

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

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

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

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

grep ' do_fork' System.map

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

c0105020 T do_fork

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

或者,直接打開System.map搜索對應函數名或者地址。System.map內容類似如下:

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

2、vmlinux

vmlinux也是Linux編譯出來的內核映像文件,可以通過nmobjdumpreadelf等工具來查看它的符號表,從而獲取函數地址。

2.1 nm讀取vmlinux

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

  • nm查找vmlinux中函數名為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反匯編出來,得到的反匯編文件就會包含函數名和對應的 地址 ,可以直接查看文本內容。

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

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

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

objdump -D vmlinux > vmlinux_dump.txt

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

2.3 readelf讀取vmlinux

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

readelf -s vmlinux

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

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

readelf -s vmlinux | grep "do_fork"

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

56481: c10601e0    96 FUNC    GLOBAL DEFAULT    1 do_fork

輸出內容表示,do_fork函數的地址是c10601e0

3、/proc/kallsyms

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

/proc/kallsyms是一個由運行中的 內核動態生成的虛擬文件 ,它反映了 當前運行的內核的狀態

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

CONFIG_KALLSYMS=y

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

cat /proc/kallsyms | grep " do_fork"

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

ffffffff810b57b0 T do_fork

輸出內容表示do_fork函數的地址是ffffffff810b57b0

4、內核接口

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

kallsyms_lookup_name

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

該函數會返回對應函數名的地址。

sprint_symbol

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

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

    關注

    3

    文章

    1363

    瀏覽量

    40228
  • Linux
    +關注

    關注

    87

    文章

    11230

    瀏覽量

    208937
  • 調試
    +關注

    關注

    7

    文章

    572

    瀏覽量

    33899
  • 函數
    +關注

    關注

    3

    文章

    4307

    瀏覽量

    62434
收藏 人收藏

    評論

    相關推薦

    四種模擬輸入信號的保護電路實現方法

    本文介紹了四種模擬輸入信號的保護電路的實現方法
    發表于 03-28 09:55 ?1133次閱讀

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

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

    請問MATHLIB的庫函數為什么每個都有四種?有什么區別?

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

    IO口的四種使用方法

    IO口的四種使用方法高阻態的典型應用
    發表于 01-12 07:16

    IO口的四種使用方法

    IO口的四種使用方法高阻態的典型應用
    發表于 02-02 06:58

    IO口的四種使用方法

    IO口的四種使用方法高阻態的典型應用
    發表于 02-19 07:23

    Word技巧:快速實現雙面打印的四種方法

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

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

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

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

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

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

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

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

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

    四種常用的諧波治理方法

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

    改善您的模數轉換器系統電源抑制狀況的四種方法

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

    四種方法實現LED點亮

    四種方法實現LED點亮程序分享
    發表于 12-28 10:03 ?3次下載

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

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