【问题标题】:"Unknown symbol in module" error while inserting kernel module插入内核模块时出现“模块中的未知符号”错误
【发布时间】:2013-05-13 15:46:17
【问题描述】:

出于教育目的,我创建了以下容易出错的内核模块。

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/proc_fs.h>
#include <linux/string.h>
#include <asm/uaccess.h>

void *(my_funptr)(void);

int bug1_write(struct file *file,
               const char *buf,
               unsigned long len) {
        my_funptr();
        return len;
}

int init_module(void) {
        static struct proc_dir_entry *proc;
        proc = create_proc_entry("bug1", 0666, 0);
        proc->write_proc = bug1_write;
        return 0;
}

我使用以下 Makefile 编译它:-

obj-m += bug1.o

all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

编译给了我:-

$ make
make -C /lib/modules/3.0.0-13-generic-pae/build M=/home/fusion/kernel_exp modules
make[1]: Entering directory `/usr/src/linux-headers-3.0.0-13-generic-pae'
  Building modules, stage 2.
  MODPOST 1 modules
WARNING: "my_funptr" [/home/fusion/kernel_exp/bug1.ko] undefined!
make[1]: Leaving directory `/usr/src/linux-headers-3.0.0-13-generic-pae'

尝试安装内核模块:-

$ sudo insmod bug1.ko
[sudo] password for fusion:
insmod: error inserting 'bug1.ko': -1 Unknown symbol in module

鉴于代码是故意的错误,我真的很想能够编译和插入内核模块——有没有我可以使用的编译器标志来做到这一点?您可以指点我的任何文件,我可以参考吗?谢谢。

【问题讨论】:

  • 您是否搜索过此问题的解决方法?我相信你会得到一个。

标签: linux-kernel kernel-module


【解决方案1】:

这是一个 C 问题。

void *(my_funptr)(void);

这声明了一个名为 my_funptr 的函数,它返回一个指针。

要声明指向函数的指针,请使用:

void (*my_funptr)(void);

【讨论】:

    猜你喜欢
    • 2021-11-28
    • 2020-09-30
    • 2012-09-27
    • 2012-08-06
    • 1970-01-01
    • 2012-02-26
    • 2015-01-15
    • 1970-01-01
    • 2012-11-08
    相关资源
    最近更新 更多