【问题标题】:Unknown symbol when loading my own kernel module加载我自己的内核模块时出现未知符号
【发布时间】:2012-11-08 04:02:32
【问题描述】:

以下代码(最后粘贴的)大部分来自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);

【问题讨论】:

    标签: linux module kernel symbols


    【解决方案1】:

    我需要将以下内容添加到我的模块源中:

    MODULE_LICENSE("GPL");
    

    【讨论】:

    • [讽刺] 很高兴内核源代码中有详细记录。 [/sarcasm] 至少我不是唯一一个遇到这个问题的人。你有没有发现为什么那一行会有所作为?
    • 我相信该行声明该模块已根据 GPL(或兼容许可证)获得许可。您不能(合法地)将非 GPL 模块与 GPL 内核源代码链接。
    • 啊,那是完全有道理的。有点认为这是推理,但不确定。
    猜你喜欢
    • 2020-09-30
    • 2012-02-26
    • 2021-11-28
    • 1970-01-01
    • 2012-12-21
    • 2012-08-06
    • 2014-01-19
    • 2017-03-31
    • 1970-01-01
    相关资源
    最近更新 更多