本人在CentOS 2.6.36下编写内核模块。
一个模块export中:定义函数int add_integar(int a, int b),然后导出EXPORT_SYMBLE(add_integar);编译通过,加载成功。
一个模块inport中:extern int add_integar(int a, int b), 然后调用add_integar函数。编译通过,但是加载失败!
错误: insmod: error inserting 'inport.ko': -1 Invalid parameters
dmesg: import: no symbol version for add_integar
错误原因: 不明,据说是2.6.36 kernel的bug
解决办法:
1) . 编译export.c , 这时在当前目录下会生成一个 Module.symvers 文件
2). 把1)中生成的Module.symvers 文件copy到import.c的目录下
3). 然后再编译 inport.c 文件
4). 先insmod export.ko, 再ins mod import.ko 就不会出现 insmod: error inserting 'inport.ko': -1 Invalid parameters 这个错误了!!
export.c
#include
#include
#include
int add_integar(int a,int b){
return a+b;
}
static int __init test_init(void){
printk("export init\n");
return 0;
}
static void __exit test_exit(void){
printk("export exit\n");
}
module_init(test_init);
module_exit(test_exit);
MODULE_LICENSE("Dual BSD/GPL");
EXPORT_SYMBOL(add_integar);
ifneq ($(KERNELRELEASE),)
obj-m := export.o
else
PWD := $(shell pwd)
KVER := $(shell uname -r)
KDIR := /lib/modules/$(KVER)/build
all:
$(MAKE) -C $(KDIR) M=$(PWD) modules
clean:
$(MAKE) -C $(KDIR) M=$(PWD) clean
endif
#include #include
#include
extern int add_integar(int a,int b);
static int __init test_init(void){
printk("add_integar(1,2)=%d\n",add_integar(1,2));
return 0;
}
static void __exit test_exit(void){
printk("bye!\n");
}
module_init(test_init);
module_exit(test_exit);
MODULE_LICENSE("GPL");
ifneq ($(KERNELRELEASE),)
obj-m := inport.o
else
PWD := $(shell pwd)
KVER := $(shell uname -r)
KDIR := /lib/modules/$(KVER)/build
all:
$(MAKE) -C $(KDIR) M=$(PWD) modules
clean:
$(MAKE) -C $(KDIR) M=$(PWD) clean
endif
3).在inport.c目录中执行: Make 和 insmod inport.ko
就不会出错了!!!