【发布时间】:2017-03-18 18:58:17
【问题描述】:
我想在我的内核模块中使用函数getname。它不出口。由于我现在遇到了这个问题,我想知道如何访问和使用任何未导出的内核符号。我认为使用一个所需的步骤会有所不同,具体取决于符号是什么,所以我想看看如何为类型(例如,结构)、变量、指针表(如系统调用表)和一个函数。在这两种情况下如何做到这一点:
- 当我从
System.map或/proc/kallsyms知道符号的地址时。 - 当我知道符号的名称并想使用
kallsyms_lookup_name检索它时。
我目前知道如何劫持系统调用,这需要声明类似
asmlinkage <return_type> (*<name_for_system_call>)(<the types of the its arguments separated by commas>);
会使用类似的东西吗?在this另一个问题的回答中,发帖人给出的例子是
#include <linux/kallsyms.h>
static void (*machine_power_off_p)(void);
machine_power_off = (void*) kallsyms_lookup_name("machine_power_off");
但是如果符号返回一个指针呢?我可以在(*machine_power_off_p) 的左边加一个星号吗?
【问题讨论】:
-
“我要不要在第一组括号的左边加一个星号?”哪个括号?您的问题中有很多括号。那么您是在问如何调用函数指针吗?谷歌应该能够告诉你。例如:How do function pointers in C work?
-
@kaylum 该问题正上方示例中的第一组。
-
But what if the symbol returns a pointer?- 然后将示例中的 leftvoid替换为返回类型(例如,struct filename *)。正如 kaylum 所注意到的,问题实际上是关于函数指针的使用。
标签: c linux linux-kernel kernel-module