zooka
驱动牛犊
驱动牛犊
  • 注册日期2004-01-16
  • 最后登录2004-02-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1002回复:0

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

楼主#
更多 发布于:2004-02-12 20:38
一个源文件里前面的一段代码

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

不知大家有没有碰到这种情况,请高手指教
先谢过大家了
游客

返回顶部