阅读:2712回复:5
编译的内核模块和当前内核的版本号不一致该怎么办?
各位大侠:
我初写linux driver,我开始参照LDD写一个很简单得hello world程序(只是学会建立和安装一个module)。源码如下: #define MODULE #include<linux/module.h> int init_module(void) { printk("<1> Hello,world\n"); return 0; } void clean_module(void) { printk("<1>Goodbye world!\n"); } 编译采用:gcc -c hello.c 安装时采用:insmod ./hello.o 但是在运行安装命令后却出现错误提示“编译的内核模块和当前内核的版本号不一致”,请问改如何解决? 是我得头文件或预定义有问题还是编译命令有问题? 如何采用通用得makefile文件编译? 问题很简单,但还是恳请高手解决! |
|
沙发#
发布于:2004-02-19 13:55
Linux的loadable module的编译方法和普通的程序不一样。修改内核代码更不可取。
solution: (1)试gcc -c -Wall _D__KERNEL___ _DMOUDLE -I/usr/src/linux/include -O2 -c -o hello.o hello.c (2)LDD中对module的编译没有进行很好的分析,建议看Linux Loadable Kernel Module HOWTO http://gnu.kookel.org/ftp/LDP/HOWTO/Module-HOWTO/ (3)到网上下ldd2的例子程序包 |
|
板凳#
发布于:2004-02-18 21:51
按照如下步骤,以后你编译的就不会说版本错误了:
cd /usr/include rm -f linux rm -f asm rm -f scsi ln -s /usr/src/linux-2.4/include/linux linux ln -s /usr/src/linux-2.4/include/scsi scsi ln -s /usr/src/linux-2.4/include/asm-i386 asm ^_^,试试吧,兄弟!!! |
|
地板#
发布于:2004-02-16 19:14
xdjm,我改了version.h,见下,但是还是出现那个问题.怎样才能不出现警告?
[root@localhost linux]# cat version.h #include <linux/rhconfig.h> #if defined(__module__smp) #define UTS_RELEASE "2.4.18-14smp" #elif defined(__module__BOOT) #define UTS_RELEASE "2.4.18-14BOOT" #elif defined(__module__bigmem) #define UTS_RELEASE "2.4.18-14bigmem" #elif defined(__module__debug) #define UTS_RELEASE "2.4.18-14debug" #else #define UTS_RELEASE "2.4.18-14" #endif #define LINUX_VERSION_CODE 132114 #define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c)) [root@localhost linux]# insmod /home/terrace/hello.o /home/terrace/hello.o: kernel-module version mismatch /home/terrace/hello.o was compiled for kernel version 2.4.9-9 while this kernel is version 2.4.18-14. 以上为原来的version.h,现在改动. [root@localhost linux]# vi version.h [root@localhost linux]# vi version.h 以下为改动后的version.h [root@localhost linux]# cat version.h #include <linux/rhconfig.h> #if defined(__module__smp) #define UTS_RELEASE "2.4.9-9smp" #elif defined(__module__BOOT) #define UTS_RELEASE "2.4.9-9BOOT" #elif defined(__module__bigmem) #define UTS_RELEASE "2.4.9-9bigmem" #elif defined(__module__debug) #define UTS_RELEASE "2.4.9-9debug" #else #define UTS_RELEASE "2.4.9-9" #endif #define LINUX_VERSION_CODE 132114 #define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c)) 再次运行! [root@localhost linux]# insmod /home/terrace/hello.o /home/terrace/hello.o: kernel-module version mismatch /home/terrace/hello.o was compiled for kernel version 2.4.9-9 while this kernel is version 2.4.18-14. [root@localhost linux]# |
|
地下室#
发布于:2004-02-16 19:00
非常感谢您的答复!
我用-f选项后的确可一,但是却出现以下警告,而且没有显示信息(打印hello world!)很不爽,而且这样会影想模块运行吗? 谢谢! [root@localhost terrace]# insmod -f ./hello.o Warning: kernel-module version mismatch ./hello.o was compiled for kernel version 2.4.9-9 while this kernel is version 2.4.18-14 Warning: loading ./hello.o will taint the kernel: no license See http://www.tux.org/lkml/#export-tainted for information about tainted modules Warning: loading ./hello.o will taint the kernel: forced load Module hello loaded, with warnings |
|
5楼#
发布于:2004-02-16 18:45
头文件有问题,严格来说应该使用与当前内核版本一致的头文件。
或者: 把include/linux/version.h(具体路径名忘记了)中跟版本有关的宏定义修改一下,改成与你当前内核版本匹配就可以了。 或者: insmod -f ./hello.o 都可以解决这个问题。 |
|