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

    文章

    1372

    浏览量

    40278
  • Linux
    +关注

    关注

    87

    文章

    11292

    浏览量

    209329
  • 调试
    +关注

    关注

    7

    文章

    578

    浏览量

    33923
  • 函数
    +关注

    关注

    3

    文章

    4327

    浏览量

    62573
收藏 人收藏

    评论

    相关推荐

    四种模拟输入信号的保护电路实现方法

    本文介绍了四种模拟输入信号的保护电路的实现方法
    发表于 03-28 09:55 1194次阅读

    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 1570次阅读

    教你四种神奇的电脑开机方法

    教你四种神奇的电脑开机方法 如果有人问你,你的电脑怎么开机?回答不外乎是:“直接按电脑机箱上的电源开关按钮不就得了”。这当然是最简
    发表于 02-23 15:20 994次阅读

    如何延长iPhone的寿命 告诉你四种方法

    本文主要介绍了如何延长iPhone寿命的四种简单方法,具体的跟随小编一起来了解一下。
    的头像 发表于 03-31 07:19 7345次阅读

    四种特殊的线路板电镀方法

    本视频主要详细介绍了四种特殊的线路板电镀方法,分别是指排式电镀、通孔电镀、卷轮连动式选择镀、刷镀。
    的头像 发表于 05-28 17:42 5782次阅读

    直流电阻测试仪的四种使用方法

    本文主要阐述了直流电阻测试仪的四种使用方法
    发表于 10-24 10:41 1.4w次阅读

    四种常用的谐波治理方法

    绿+波杰能从事谐波治理20余年,结合自己20多年的从业经验,以及相关的资料、研究,绿+波杰能将谐波治理的基本方法进行了总结,与大家一同探讨之。绿+波杰能常用的谐波治理的基本方法,有以下四种
    发表于 03-01 16:09 1.3w次阅读

    改善您的模数转换器系统电源抑制状况的四种方法

    改善您的模数转换器系统电源抑制状况的四种方法
    发表于 11-04 09:51 1次下载
    改善您的模数转换器系统电源抑制状况的<b class='flag-5'>四种方法</b>

    四种方法实现LED点亮

    四种方法实现LED点亮程序分享
    发表于 12-28 10:03 3次下载

    干货 | 数字万用表四种妙用方法,你知道么?

    干货 | 数字万用表四种妙用方法,你知道么?
    的头像 发表于 01-05 09:52 1129次阅读