2013-05-13 1 views
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 

Учитывая, что код я действительно хотел бы скомпилировать и вставить модуль ядра - есть ли какой-нибудь флаг компилятора, который я мог бы использовать, чтобы это сделать? Любая документация, на которую вы могли бы указать мне, что я могу назвать? Благодарю.

+0

ли вы искать исправление этой проблемы? Я уверен, вы его получите. –

ответ

1

Это проблема с C.

void *(my_funptr)(void); 

Объявляет функцию с именем my_funptr, которая возвращает указатель.

Чтобы объявить указатель на функцию, используйте:

void (*my_funptr)(void);