首页 > 解决方案 > 使声明的变量引用已经存在的内核符号

问题描述

这个问题有两个部分:

  1. 将非导出内核函数定义为位于特定地址并使用与非导出内核函数相同的名称。
  2. 一旦知道其地址,就导出未导出的内核函数。

这个问题将kallsyms_lookup_name在其示例中使用。从 Linux 5.7 开始,它不再被导出,所以这是合适的。

定义非导出函数

如果开发人员知道尚未导出的内核函数的地址并希望使用它,我看到它通常以以下方式完成:

// For `void __stack_chk_fail(void)`
void (*scf)(void) = (int (*)() ) ADDRESS;
// Called like below.
scf();

// For `struct filename *getname(const char __user *)`
static struct filename *(*getname_p)(const char __user *);
getname_p = (struct filename *(*)(const char __user *) ADDRESS;
// I actually don't know how this one is called.

// For `void machine_power_off(void)`
static void (*machine_power_off_p)(void);
machine_power_off_p = (void*) ADDRESS;
// Called like below.
(*machine_power_off_p)();

现在假设我想使用kallsyms_lookup_name(不再导出)并且我想调用它kallsyms_lookup_name而不是一些别名,例如kln/ kallsyms_lookup_name_ptr/whatever。函数的声明可以包含在代码中 using #include <linux/kallsyms.h>,但我怎样才能让包含的声明引用非 dxported 的地址kallsyms_lookup_name

使非导出功能可用

从 Linux 5.7 开始,不再有EXPORT_SYMBOL_GPL(kallsyms_lookup_name). 在确定地址kallsyms_lookup_name并完成上述操作之后,如何将其导出或以其他方式提供给其他内核模块kallsyms_lookup_name

标签: clinuxkernel-module

解决方案


推荐阅读