LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1074|回复: 0

关于内核模块的版本控制问题

[复制链接]
发表于 2004-2-12 20:35:54 | 显示全部楼层 |阅读模式
一个源文件里前面的一段代码

#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以前的才包含此头文件

不知大家有没有碰到这种情况,请高手指教
先谢过大家了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表