阅读:2358回复:9
insmod出现版本不匹配,各种方法试了都不行
#define __NO_VERSION__
#define __KERNEL__ #define MODULE #include <linux/kernel.h> #include <linux/module.h> int init_module(void) { printk("<1>Hello, world\n"); return 0; } void cleanup_module(void) { printk("<1>Goodbye cruel world\n"); } MODULE_LICENSE("GPL"); 能想到的都加了,但insmod的时候总是不行,只能强行安装(insmod -f ) 是不是我还漏了什么,有没有其他办法 |
|
沙发#
发布于:2004-04-11 12:02
不是你漏了,LINUX内核一直有这毛病,编译出来报告版本不对,我查过原因,是因为make dep的问题,没修改/usr/src/linux/include/linux/version/的一个很重要的文件,名字忘了,叫modues什么的,符号名全在里面.我以前的解决办法是自已写了个程序,从/proc/ksysb文件里取出符号名,写到那个文件里去.当然,不能完说是make dep的错,新手在做编译前常常漏了如下工作:
make include/linux/versioh.h make dep 另外,你的内核配置,也就是make menuconfig里的那些选项,最好和现在运行的KERNEL一至.因为我就碰到过,将SCSI去掉后,编译出来的就不能用了,加上就好了. |
|
板凳#
发布于:2004-04-11 12:04
唉唉唉,没看清楚,你第一句写的是什么意思啊?你没看明白就加,当然不能加载啦.那NO_VERSION的意思是编译出来的模块名不带版本信息,而你的内核却带该信息,先报这个错误解决了再看我前面那个贴子.
|
|
地板#
发布于:2004-04-11 16:21
好象也不行,我在radhat9下不成功, insmod加了-f参数加载进去了,但是好象根本就没运行的...-
|
|
地下室#
发布于:2004-04-11 22:50
我建议你先取一个LINUX自带的驱动程序,例如rd.c,将它编译出来,如果不能正常加载,就说明是编译的过程还有问题.
成功后,你删了编译出来的rd.o,重做一次make modules,将输入重定向到文件中,然后到里面去找到编译rd.c的那一行,就得到了一个正确的编译命令行.你会发现该行命令比你用的复杂得多.不错,这就是你漏掉的东西.接下来,把rd.c里的内容删空,仅保留include,macro和init()这些,这样你就得到了一个模板,以后要做什么驱动就用这个模板扩展. |
|
5楼#
发布于:2004-04-15 21:30
#include <linux/kernel.h>
#include <linux/module.h> #if CONFIG_MODVERSIONS==1 #define MODVERSIONS #include <linux/modversions.h> #endif int init_module(void) { MODULE_LICENSE(\"GPL\"); printk(\"Hello,World!\\n\"); return 0; } void cleanup_module(void) { printk(\"Goodbye cruel world \\n\"); } makefile文件如下: CC=gcc MODCFLAGS:=-Wall -DMODULE -D__KERNEL__ -DLINUX -I /usr/src/linux-2.4.20-8/include hello.o:hello.c /usr/include/linux/version.h $(CC) $(MODCFLAGS) -c hello.c 然后make insmod 就行我试过! |
|
6楼#
发布于:2004-04-16 20:02
#define __NO_VERSION__
#define __KERNEL__ #define MODULE 这几句有问题 |
|
7楼#
发布于:2004-04-25 09:54
我也是初学,不过看了很多帖子之后解决了这样的问题,帖出来帮一下忙。
/* FILE : demo.c * * USAGE : How to write module driver * * AUTHOR : Bismar@HUST */ #ifndef __KERNEL__ #define __KERNEL__ #endif #ifndef MODULE #define MODULE #endif #include <linux/fs.h> #include <linux/kernel.h> #define __NO_VERSION__ #include <linux/module.h> #include <linux/version.h> char kernel_version[] = UTS_RELEASE; #if CONFIG_MODVERSIONS==1 #define MODVERSIONS #include <linux/modversions.h> #endif #ifdef CONFIG_SMP #define __SMP__ #endif /* Initialize the module */ int __init init_device (void) { printk (KERN_DEBUG \"Hello,Linux driver world! \\n\"); return 0; } /* Cleanup - undid whatever init_module did */ void __exit cleanup_device (void) { printk (KERN_DEBUG \"Goodbye cruel world !\\n\"); } /* Init and exit function decleare */ module_init (init_device); module_exit (cleanup_device); /* Declare licence to avoid warnings */ MODULE_LICENSE (\"GPL\"); 下面是makefile的内容,注意要修改一下include的路径: # # makefile for demo # # Bismar@HUST CC = gcc CINCLU = /usr/src/linux-2.4/include CFLAGS = -D__KERNEL__ -DMODULE -DLINUX -c -O2 -Wall -I$(CINCLU) all: demo.o demo.o:demo.c $(CC) $(CFLAGS) $< clean: rm -f *.o 测试平台:redhat9.0,内核版本linux-2.4.20-8,不过只要修改了include的路径,版本是无关紧要的。 |
|
8楼#
发布于:2004-04-26 08:52
在/usr/src/你的linux内核目录下的
Makefile 文件里面 第四行,改掉。然后再make。你再编译看看 |
|
9楼#
发布于:2004-04-26 08:55
换一次kernel,就要make一次!
|
|