以下代码(最后粘贴)主要来自here,是一个非常简单的内核模块,充当键盘记录器。我可以让它编译并生成.ko就好了,但是当我尝试加载它时,我在dmesg中得到以下错误:
[ 790.833828] keylogger: Unknown symbol unregister_keyboard_notifier (err 0)
[ 790.833846] keylogger: Unknown symbol register_keyboard_notifier (err 0)
我没有从源代码构建我的内核,而是使用随archlinux提供的库存内核。然而,我确实安装了kernel-headers包来让模块进行编译。
所以我的问题是:在我安装的内核中是否找不到这两个符号?如果是,为什么它们不能正确链接(?)?
我可以找到符号存在的证据。首先,我可以在/proc/kallsyms
中看到符号。此外,当我nm /usr/src/vmlinux
时,我也可以看到这两个符号。他们不一样吗?
模块代码:
#include <linux/module.h> /* Needed by all modules */
#include <linux/keyboard.h>
EXPORT_SYMBOL_NOVERS(unregister_keyboard_notifier);
EXPORT_SYMBOL_NOVERS(register_keyboard_notifier);
int hello_notify(struct notifier_block *nblock, unsigned long code, void *_param) {
struct keyboard_notifier_param *param = _param;
struct vc_data *vc = param->vc;
int ret = NOTIFY_OK;
if (code == KBD_KEYCODE) {
printk(KERN_DEBUG "KEYLOGGER %i %s\n", param->value, (param->down ? "down" : "up"));
}
}
static struct notifier_block nb = {
.notifier_call = hello_notify
};
static int hello_init(void)
{
register_keyboard_notifier(&nb);
return 0;
}
static void hello_release(void)
{
unregister_keyboard_notifier(&nb);
}
module_init(hello_init);
module_exit(hello_release);
答案 0 :(得分:4)
我需要将以下内容添加到我的模块源:
MODULE_LICENSE("GPL");