测试环境:openEuler 22.03

架构:x86_64

Linux内核原本提供了kallsyms_lookup_name用于获取未exported函数的指针位置,但是在Linux Kernel 5.7.0版本之后,kallsyms_lookup_name函数也没有export了,下面模块代码中提供了一种通过kprobe获得kallsyms_lookup_name函数起始地址的方式。

代码主要流程:

(1)调用register_kprobe获得kallsyms_lookup_name函数的地址指针kallsyms_lookup_name_func

(2)调用kallsyms_lookup_name_func获取其它未export的函数的地址指针(print_modules)

// allsyms_lookup_name_test#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/kallsyms.h>
#include <linux/kprobes.h>int noop_pre(struct kprobe *p, struct pt_regs *regs) { return 0; }static struct kprobe kp = {   .symbol_name = "kallsyms_lookup_name",
};unsigned long (*kallsyms_lookup_name_fun)(const char *name) = NULL;// 调用kprobe找到kallsyms_lookup_name的地址位置
int find_kallsyms_lookup_name(void)
{ int ret = -1;kp.pre_handler = noop_pre;ret = register_kprobe(&kp);if (ret < 0) {  printk(KERN_INFO "register_kprobe failed, error:%d\n", ret); return ret; }printk(KERN_INFO "kallsyms_lookup_name addr: %p\n", kp.addr); kallsyms_lookup_name_fun = (void*)kp.addr; unregister_kprobe(&kp);return ret;
}static int __init kallsyms_lookup_name_test_init(void)
{int ret;ret = find_kallsyms_lookup_name();if (ret < 0) {printk(KERN_INFO "find kallsyms_lookup_name failed\n");return ret;}static typeof(&print_modules) print_modules_p;//调用kallsyms_lookup_name_fun指针找到print_modules函数起始地址位置print_modules_p = (typeof(&print_modules))kallsyms_lookup_name_fun("print_modules");//打印内核加载的模块print_modules_p();printk(KERN_INFO "print_modules_p: 0x%p", print_modules_p);return 0;
}static void __exit kallsyms_lookup_name_test_exit(void) { return; }module_init(kallsyms_lookup_name_test_init);
module_exit(kallsyms_lookup_name_test_exit);
MODULE_LICENSE("GPL");

Makefile如下:

obj-m+=kallsyms_lookup_name_test.oall:make -C /lib/modules/$(shell uname -r)/build/ M=${PWD} modules
clean:make -C /lib/modules/$(shell uname -r)/build/ M=${PWD} clean

测试结果:

参考资料:

linux内核查找符号_wjx5210的博客-CSDN博客_linux 符号查找

内核查找符号指针函数kallsyms_lookup_name相关推荐

  1. linux内核查找符号

    在2.4内核默认的非static 函数和变量都会自动导入到kernel 空间的,在使用C来写应用时,可以通过#include和链接动态库的形式形成一个动态链接文件,其中#include是在预编译阶段提 ...

  2. c/c++ 指针函数 和 函数指针

    指针函数:返回指针类型的函数,定义方法如下: 类型标识符 *函数名(参数列表) 函数指针:指向函数入口地址的指针,定义方法如下: 类型标识符 (*指针名称)(形参列表) 下面我们通过一段代码加深我们的 ...

  3. Excel函数大全-10查找和引用函数

    10查找和引用函数 10x01 ADDRESS 函数 语法 10x02 AREAS 函数 语法 10x03 CHOOSE 函数 语法 10x04 COLUMN 函数 语法 10x05 COLUMNS ...

  4. kptr_restrict 向用户空间内核中的指针(/proc/kallsyms-modules显示value全部为0)

    CSDN GitHub kptr_restrict 向用户空间内核中的指针(/proc/kallsyms-modules显示value全部为0) LinuxDeviceDrivers/study/de ...

  5. c语言利用指针函数等完成学生成绩管理系统,课程设计C语言可视化程序学生成绩管理系统...

    <课程设计C语言可视化程序学生成绩管理系统>由会员分享,可在线阅读,更多相关<课程设计C语言可视化程序学生成绩管理系统(37页珍藏版)>请在人人文库网上搜索. 1.C语言可视化 ...

  6. C语言--指针函数和函数指针

    指针函数和函数指针 指针函数其实是一个简称,是指带指针的函数,它本质上是一个函数,只是返回的是某种类型的指针.其定义的格式为: 类型标识符 *函数名(参数表)  函数指针,从本质上说是一个指针,只是它 ...

  7. 指针数组,数组指针,指针函数,函数指针,二级指针详解

    先看个简单的:char *p,这定义了一个指针,指针指向的数据类型是字符型,char  *(p)定义了一个指针P: char *p[4], 为指针数组,由于[]的优先级高于*,所以p先和[]结合,p[ ...

  8. VS2015 error LNK2019 无法解析的外部符号 _WinMain@16,该符号在函数 int __cdecl invoke_main(void)

    前言 上一篇文章中,为了编译OpenCV的示例代码,然后搭建环境, 最后想直接运行示例demo,我在创建新工程的时候,直接创建了一个win32窗口项目,然后环境配置完成后,将opencv 的示例代码k ...

  9. linux内核中测量时间的方法,Linux内核中获取时间函数do_gettimeofday

    内核代码能一直获取一个当前时间的表示, 通过查看 jifies 的值. 常常地, 这个值只代表从最后一次启动以来的时间, 这个事实对驱动来说无关, 因为它的生命周期受限于系统的 uptime. 如所示 ...

最新文章

  1. yii2 设置的缓存无效,返回false,不存在
  2. Elicpse创建Maven项目
  3. BI工具和数据中台有什么区别?数据中台初探
  4. JUC锁框架——CyclicBarrier
  5. 卡常神器——register 与 快速读入输出
  6. Power Bi:DAX函数总结
  7. oracle中新增一列赋值,给List里添加一字段并赋值 | 学步园
  8. 运行Java应用必须通过main()方法吗?
  9. 动态加载JS过程中如何判断JS加载完成
  10. 武汉.NET俱乐部12月活动图片及课件下载
  11. 数字电子技术期末考试思维导图
  12. 这样投递简历更容易找到工作
  13. 合肥耀之阳电商:网店运营的基础知识
  14. 惠普m128fn中文说明书_惠普M128fw使用说明书
  15. 中文域名正确注册、配置、使用
  16. 英语学习-综合英语(1)
  17. 5个方法将不带www的根域名301重定向到www主域名
  18. UFCS 移动终端融合快速充电说明 一 物理层特性
  19. 解决 TypeError: Cannot read properties of undefined (reading ‘push‘) 错误提示
  20. A Vertical Kelvin Test Structure for Measuring the True Specific Contact Resistivity

热门文章

  1. TRIMMEAN函数实例:评委打分计算最后得分
  2. (3)Pairing Functions Element Functions
  3. MySQL更新时间的时候生成随机时间
  4. Unknown column 'salary' in 'field list'
  5. Feature Enhancement Network: A Refined Scene Text Detector
  6. 2020中山大学计算机学院保研,我校举行中山大学2020级研究生招生宣讲会
  7. Weekly Recap!相对不平淡的行情 相对冷淡的 DeFi 市场
  8. 如何在Node中将PDF每页转换为图片以及PDF各种操作
  9. STM32 freertos堆栈溢出检查方法
  10. ubuntu 改屏幕分辨率命令_Ubuntu修改屏幕分辨率