阅读:1002回复:0
关于内核模块的版本控制问题
一个源文件里前面的一段代码
#ifndef __KERNEL__ # define __KERNEL__ #endif #ifndef MODULE # define MODULE #endif #include<linux/config.h> /* retrieve the CONFIG_* macros */ #if defined(CONFIG_MODVERSIONS) && ! defined(MODVERSIONS) # define MODVERSIONS #endif #if defined(CONFIG_SMP) && ! defined(__SMP__) # define __SMP__ #endif #if defined (MODVERSIONS) # include<linux/modversions.h> #endif 编译时有如下错误 [zooka@localhost ettouch]$ gcc -o ettouch.o ettouch.c In file included from ettouch.c:26: /usr/include/linux/modversions.h:1:2: #error Modules should never use kernel-headers system headers, /usr/include/linux/modversions.h:2:2: #error but headers from an appropriate kernel-source 有点不明白:如果系统定义了CONFIG_MODVERSIONS的话 就是说内核启动了版本控制,然后定义MODVERSIONS, 使模块也启动版本控制,再包含<linux/modversions.h>, 这个头文件里面包含了内核导出的符号的版本化名字 按照以上的理论,那么上面的预处理程序应该是没错的啊 但在编译的时候就发生上面的错误 打开<linux/modversions.h>来看一下,发现里面就只有上面那两行错误的代码 根本就不是内核导出的符号的版本化名字 但内核里已定义了CONFIG_MODVERSIONS了啊,<linux/modversions.h>却没内容 这点实在想不明白 后来看了一下8139网卡的源代码,发现它是这样处理的 #if defined(MODVERSIONS) && LINUX_VERSION_CODE<0x20300 # include<linux/modversions.h> #endif 它这里是要内核版本是2.3以前的才包含此头文件 不知大家有没有碰到这种情况,请高手指教 先谢过大家了 |
|