Linux 內核獲取函數size

方式一:通過objdump -t直接從目標文件中獲取函數size

#objdump -t file_unread.o | grep hook
0000000000000030 l     F .text  000000000000012f hook_vfs_read

0000000000000030 l F .text 000000000000012f hook_vfs_read各個字段說明

  • 0000000000000030:符號的地址或值,這里是一個相對地址,表示該符號在.text節中的偏移量。
  • l:符號的綁定屬性,這里是小寫字母l,表示該符號是一個局部符號,只在當前目標文件中可見。
  • F:符號所在的節(section)的類型,這里是大寫字母F,表示該符號所在的節是一個函數節(function section)。
  • .text:符號所在的節的名稱,這里是.text,表示該符號所在的節是代碼節。
  • 000000000000012f:符號的大小,以字節為單位,這里是0x12f,表示該函數的大小為303字節。
  • hook_vfs_read:符號的名稱,這里是hook_vfs_read,表示該符號是一個名為hook_vfs_read的函數。

vfs_read+0xe6/0x2c0 表示什么意思呢?

其中vfs_read 是函數名,+0xe6/0x2c0 是函數在代碼中的偏移量。具體來說,+0xe6 表示函數內部代碼的偏移量,/ 后面的 0x2c0 表示函數的總大小(以字節為單位)。

hook_vfs_read+0xe4/0x130 [fi_file]為動態打印進程調用棧信息。

方式二:通過objdump -D反匯編后計算函數size

objdump對目標文件進行反匯編,從匯編代碼中計算hook_vfs_read的函數size

0000000000000030 <hook_vfs_read>:30:   e8 00 00 00 00          callq  35 <hook_vfs_read+0x5>35:   41 57                   push   %r1537:   41 56                   push   %r1439:   31 c0                   xor    %eax,%eax......14f:   eb c3                   jmp    114 <hook_vfs_read+0xe4>151:   48 c7 c7 00 00 00 00    mov    $0x0,%rdi158:   e8 00 00 00 00          callq  15d <hook_vfs_read+0x12d>15d:   eb a3                   jmp    102 <hook_vfs_read+0xd2>15f:   90                      nop

hook_vfs_read_size = 0x15f - 0x30 = 0x12f + 1,從計算的結果來看,加上偏移與調用棧打印的函數size是一致的。

-t, --syms               Display the contents of the symbol table(s)
-D, --disassemble-all    Display assembler contents of all sections

方式三:通過內核函數動態獲取函數size

/*** sprint_symbol - Look up a kernel symbol and return it in a text buffer* @buffer: buffer to be stored* @address: address to lookup** This function looks up a kernel symbol with @address and stores its name,* offset, size and module name to @buffer if possible. If no symbol was found,* just saves its @address as is.** This function returns the number of bytes stored in @buffer.*/
int sprint_symbol(char *buffer, unsigned long address)
{return __sprint_symbol(buffer, address, 0, 1);
}
EXPORT_SYMBOL_GPL(sprint_symbol);

路徑1:

獲取到的字符串信息示例為hook_vfs_read+0x0/0x130 [fi_file],這種方式需要從數組str中解析出函數大小0x130

解析字符串中的函數size,還是要騷操作獲取,在內核中沒有看到直接獲取函數size的函數。

#include <linux/string.h>static int __init my_init(void)
{const char *str = "hook_vfs_read+0x0/0x130 [fi_file]";const char *prefix = "/0x";const char *suffix = " [";char *start, *end;unsigned long value;// 查找前綴字符串start = strstr(str, prefix);if (!start) {printk(KERN_ERR "Failed to find prefix string\n");return -EINVAL;}start += strlen(prefix);// 查找后綴字符串end = strstr(start, suffix);if (!end) {printk(KERN_ERR "Failed to find suffix string\n");return -EINVAL;}// 截取字符串*end = '\0';value = simple_strtoul(start, NULL, 16);printk(KERN_INFO "Value: 0x%lx\n", value);return 0;
}

路徑二:

內核代碼v4.18.20sprint_symbol最終調用kallsyms_lookup獲取函數size,因此也可以直接調用該函數獲取函數size,免去上述復雜的字符串解析過程。

/** Lookup an address* - modname is set to NULL if it's in the kernel.* - We guarantee that the returned name is valid until we reschedule even if.*   It resides in a module.* - We also guarantee that modname will be valid until rescheduled.*/
const char *kallsyms_lookup(unsigned long addr,unsigned long *symbolsize,unsigned long *offset,char **modname, char *namebuf)
{const char *ret;namebuf[KSYM_NAME_LEN - 1] = 0;namebuf[0] = 0;if (is_ksym_addr(addr)) {unsigned long pos;pos = get_symbol_pos(addr, symbolsize, offset);/* Grab name */kallsyms_expand_symbol(get_symbol_offset(pos),namebuf, KSYM_NAME_LEN);if (modname)*modname = NULL;return namebuf;}/* See if it's in a module or a BPF JITed image. */ret = module_address_lookup(addr, symbolsize, offset,modname, namebuf);if (!ret)ret = bpf_address_lookup(addr, symbolsize,offset, modname, namebuf);if (!ret)ret = ftrace_mod_address_lookup(addr, symbolsize,offset, modname, namebuf);return ret;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/713392.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/713392.shtml
英文地址,請注明出處:http://en.pswp.cn/news/713392.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【cmu15445c++入門】(13)C++的std::promise

一、說明 std::promise 是C11并發編程中常用的一個類&#xff0c;常配合std::future使用。其作用是在一個線程t1中保存一個類型typename T的值&#xff0c;可供相綁定的std::future對象在另一線程t2中獲取 二、代碼 #include <chrono> #include <future> #includ…

Hive SQL 開發指南(二)使用(DDL、DML,DQL)

在大數據領域&#xff0c;Hive SQL 是一種常用的查詢語言&#xff0c;用于在 Hadoop上進行數據分析和處理。為了確保代碼的可讀性、維護性和性能&#xff0c;制定一套規范化的 Hive SQL 開發規范至關重要。本文將介紹 Hive SQL 的基礎知識&#xff0c;并提供一些規范化的開發指…

如何安裝ProtoBuf環境

1 &#x1f351;下載 ProtoBuf&#x1f351; 下載 ProtoBuf 前?定要安裝依賴庫&#xff1a;autoconf automake libtool curl make g unzip 如未安裝&#xff0c;安裝命令如下&#xff1a; Ubuntu ??選擇&#xff1a; sudo apt-get install autoconf automake libtool cur…

「Vue3系列」Vue3起步/創建項目

文章目錄 一、Vue3 創建項目二、Vue3 Create詳解命令格式可選選項使用示例注意事項 三、Vue3 項目目錄結構四、Vue3 起步實例五、相關鏈接 一、Vue3 創建項目 在 Vue 3 中創建項目&#xff0c;通常使用 Vue CLI&#xff08;命令行工具&#xff09;來簡化項目的初始化過程。Vue…

Unity 向量計算、歐拉角與四元數轉換、輸出文本、告警、錯誤、修改時間、定時器、路徑、

using System.Collections; using System.Collections.Generic; using UnityEngine;public class c2 : MonoBehaviour {// 定時器float t1 0;void Start(){// 向量Vector3 v1 new Vector3(0, 0, 2);Vector3 v2 new Vector3(0, 0, 3);// 計算兩個向量的夾角Debug.Log(Vector3…

Java 學習和實踐筆記(26):組合(component)的含義以及與繼承(extends)的關系

組合的兩個作用&#xff1a; 1&#xff09;通過將父類對象作為子類的屬性 2&#xff09;通過第1點的作用&#xff0c;實現了代碼復用。 示例代碼&#xff1a; public class TestComponent {public static void main(String[] args) {Student2 s1 new Student2("jason&…

燈塔:HTML筆記

網頁由哪些部分組成&#xff1f; *文字 圖片 音頻 視頻 超鏈接 程序員寫的代碼是通過瀏覽器轉換成網頁的 五大瀏覽器有哪些&#xff1f; *IE瀏覽器 *火狐瀏覽器&#xff08;Firefox&#xff09; *谷歌瀏覽器&#xff08;Chrome&#xff09; *Safari瀏覽器 *歐朋瀏覽器&…

NENU OJ算法2例題||搜索E

NENU OJ算法2例題 合集原文指路 算法2搜索E 1281: E001 數的劃分 題目描述 將整數n分成k份&#xff0c;且每份不能為空&#xff0c;任意兩種分法不能相同&#xff08;不考慮順序&#xff09;。 例如&#xff1a;n7&#xff0c;k3&#xff0c;下面三種分法被認為是相同的。…

【數據結構與算法】動態規劃法解題20240302

這里寫目錄標題 一、198. 打家劫舍1、動態規劃五部曲 二、213. 打家劫舍 II 一、198. 打家劫舍 你是一個專業的小偷&#xff0c;計劃偷竊沿街的房屋。每間房內都藏有一定的現金&#xff0c;影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統&#xff0c;如果兩間…

速盾:使用cdn后速度慢是怎么回事?

CDN&#xff08;內容分發網絡&#xff09;是一種通過將網站的靜態內容分布到全球各地的服務器&#xff0c;從而提供更快速度和更好用戶體驗的技術。然而&#xff0c;有時候用戶會遇到使用CDN后速度變慢的問題&#xff0c;下面將探討幾種可能的原因。 服務器選擇錯誤: CDN服務通…

【python】雙十一美妝數據分析可視化 [聚類分析/線性回歸/支持向量機](代碼+報告)【獨一無二】

&#x1f449;博__主&#x1f448;&#xff1a;米碼收割機 &#x1f449;技__能&#x1f448;&#xff1a;C/Python語言 &#x1f449;公眾號&#x1f448;&#xff1a;測試開發自動化【獲取源碼商業合作】 &#x1f449;榮__譽&#x1f448;&#xff1a;阿里云博客專家博主、5…

全量知識系統問題及SmartChat給出的答復 之11 三套工具之6語法解析器之4

Q30. 原Q24.問題的錯誤糾正 我剛剛檢查了 之前的問題&#xff0c;Q24 中有明顯的錯誤。Q24 的提問是&#xff1a; “請設計一個IPP&#xff08; Integrated Partial Parser&#xff09;解析器&#xff0c;能分別基于上述兩種文法規則&#xff0c;用于分析有關某領域的一些新聞…

【JavaSE】 P165 ~ P194 抽象方法,抽象類,接口,接口內容,多接口實現和父類繼承,多態,向上轉型,向下轉型

目錄 抽象抽象的概念抽象方法和抽象類的格式抽象方法和抽象類的使用抽象方法和抽象類的注意事項● 練習1. 寫一個父類圖形類&#xff0c;其中有方法&#xff0c;功能計算面積為抽象方法。2. 抽象類繼承。判斷對錯,沒錯的分析運行結果3. 發紅包,群內用戶類作為父類&#xff0c;有…

c++相對路徑與絕對路徑

參考:https://blog.csdn.net/weixin_42175509/article/details/114360938 1、獲取當前路徑&#xff1a;用getcwd()函數&#xff0c;返回值是一個指向字符串的指針 2、相對路徑用正斜杠“/” ./&#xff0c;表示當前路徑&#xff1b;…/表示當前路徑的上一級路徑&#xff1b;…

NX二次開發:ListingWindow窗口的應用

一、概述 在NX二次開發的學習中&#xff0c;瀏覽博客時發現看到[社恐貓]和[王牌飛行員_里海]這兩篇博客中寫道有關信息窗口內容的打印和將窗口內容保存為txt,個人人為在二次開發項目很有必要&#xff0c;因此做以下記錄。 ListingWindow信息窗口發送信息四種位置類型 設置Listi…

鴻蒙系統的開發與學習:一、安裝工具與處理報錯

前言&#xff1a; 鴻蒙系統的學習與記錄。 1 、使用開發工具&#xff1a;deveco-studio 1&#xff09;這個是工具的安裝 2&#xff09;這個是工具包&#xff0c;里面包含了 obpm&#xff0c;如果你裝不上這個&#xff0c;可以使用工具包內部的 2、安裝 官方安裝教程&#xff…

前端學習第三天-css基礎

1. CSS簡介 從HTML被發明開始&#xff0c;樣式就以各種形式存在。不同的瀏覽器結合它們各自的樣式語言為用戶提供頁面效果的控制。最初的HTML只包含很少的顯示屬性。 隨著HTML的成長&#xff0c;為了滿足頁面設計者的要求&#xff0c;HTML添加了很多顯示功能。但是隨著這些功能…

面經(五)南京 軟通動力 一面

注&#xff1a;已經有了接近一年的工作經驗 總體評價 不完全是技術面&#xff0c;面試經過還行&#xff0c;但可能是期望崗位和對方需求不太一致&#xff0c;感覺不太好過 面試經過 HR找你&#xff0c;發簡歷入庫&#xff0c;然后商量面試時間&#xff0c;發騰訊會議鏈接騰…

USB4之ASM2464PD與ASM2464PDX兼容與運用

首先在NVMe上運用: 一&#xff1a;ASM2464PD&#xff08;現在可以做帶PD的方案&#xff09; 二&#xff1a;ASM2464PDX 1&#xff1a; Application Guide- CFX card reader NVMe SSD 2&#xff1a;ASM2464PDX Application Guide- NVMe SSD x4 with data clone 三&#xff…

C習題003:球筐投球(一排)

題目 輸入樣例 在這里給出一組輸入。例如&#xff1a; 5 3 7 5 7 7 3 1 5 3 1 5 2 4 4 4輸出樣例 在這里給出相應的輸出。例如&#xff1a; 12 10 12 16 8代碼長度限制 16 KB 時間限制400 ms 內存限制 64 MB 棧限制 8192 KB 代碼 #include<stdio.h> int main() {int…