Ошибка "Неизвестный символ в модуле" при вставке модуля ядра
Я создал следующий подверженный ошибкам модуль ядра для образовательных целей.
#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
Учитывая, что код намеренно глючит, я бы очень хотел иметь возможность скомпилировать и вставить модуль ядра - есть ли какой-нибудь флаг компилятора, который я мог бы использовать, чтобы сделать это? Любая документация, на которую вы могли бы указать мне, на которую я мог бы сослаться? Благодарю.
1 ответ
Решение
Это проблема С.
void *(my_funptr)(void);
Это объявляет функцию с именем my_funptr
который возвращает указатель.
Чтобы объявить указатель на функцию, используйте:
void (*my_funptr)(void);