0

教育目的で、エラーが発生しやすい次のカーネル モジュールを作成しました。

#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

コードに意図的にバグがあることを考えると、カーネル モジュールをコンパイルして挿入できるようにしたいのですが、これを行うために使用できるコンパイラ フラグはありますか? 参照できるドキュメントはありますか? ありがとう。

4

1 に答える 1

1

これは C の問題です。

void *(my_funptr)(void);

my_funptrこれは、ポインターを返すという名前の関数を宣言します。

関数へのポインターを宣言するには、次を使用します。

void (*my_funptr)(void);
于 2013-05-14T08:11:16.947 に答える