insmod: error inserting '***.ko': -1 Invalid parameters 解决办法

本人在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);


export.c 的Makefile

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

inport.c

#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");
                           

inport.c  的Makefile

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

1)在export.c目录中执行:  Make 和 insmod export.ko
2)把1)中生成的 Module.symvers copy 到inport.c目录下

3).在inport.c目录中执行: Make 和 insmod inport.ko

就不会出错了!!!



你可能感兴趣的:(Linux)