c - 使声明的变量引用已经存在的内核符号
问题描述
这个问题有两个部分:
- 将非导出内核函数定义为位于特定地址并使用与非导出内核函数相同的名称。
- 一旦知道其地址,就导出未导出的内核函数。
这个问题将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
?
解决方案
推荐阅读
- c++ - 使用谷歌风格命名约定在 vscode 中 lint c++
- javascript - 使用 npm 在引导程序中进行 Web 开发时遇到错误
- java - 是否可以使用 Azure Functions 托管 ID 操作 VM?
- sanity - 解决 Sanity.io 中块内容中的引用
- python - Python 面向对象编程中关键字“self”的用途是什么?
- php - 如何在 Mongodb 的一个管道中合并 $match 和 $geoNear 的结果
- android - 将 jobject 转换为 jstring 时崩溃 - Android Studio、Android API 28、Pixel 4XL 模拟器,仅在调试时
- json - 使用jq解析Array并映射到字符串
- java - 如何获得 2 人位置并将他们传送到其他位置
- amazon-web-services - AWS ECS:Windows 容器是否会支持 AWSVPC 网络模式?