LinuxSir.cn,穿越时空的Linuxsir!

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

为什么编译出来的自写的模块,其vermagic会和系统中的不一样?

[复制链接]
发表于 2006-5-17 11:41:09 | 显示全部楼层 |阅读模式
我从《Linux设备驱动程序 第三版》上复制出来了一个hello world 的模块:


  1. #include <linux/init.h>
  2. #include <linux/module.h>

  3. MODULE_LICENSE ("GPL");

  4. static int hello_init(void)
  5. {
  6.       printk (KERN_ALERT "hello, world\n");
  7.       return 0;
  8. }

  9. static void hello_exit(void)
  10. {
  11.       printk (KERN_ALERT "Good bye, cruel world\n");
  12. }

  13. module_init(hello_init);
  14. module_exit(hello_exit);

复制代码



Makefile只写一行: obj-m :=hello.o
编译命令是 : make –C /usr/src/linux-source-2.6.15-2 M=`pwd` modules

我的源码环境是这样建立的:
先安装源码包和头文件包,然后把头文件都拷贝到源码目录,然后把/boot目录里面的config文件拷贝到源码目录,名为.config。

这样之后,我编译模块。出来的模块用modinfo查看,其vermagic 和系统中其它模块是不一样的,总多出来“ preempt PENTIUM4”的字样,无法装载。

之后,我从源码编译一遍内核,但是不用这个新内核启动机器。用以前的内核,再编译我自己的模块。这回得到的hello.ko,它的vermagic就和系统中的一样了,可以装载了。

我在两个环境中试验:五一节之前下载的 debian etch weekly build版和sarge 3.1r2版,结果都是这样的。

我的问题是:
1.  为什么第一次编译出来的模块,它的vermagic不同。
2.  为什么第二次编译出来的模块,它的vermagic和第一次就不一样了
3.  如何正确地配置源码树呢?
发表于 2006-5-18 22:28:29 | 显示全部楼层
我比你更郁闷
下面是我的模块
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>

       

int startmodule(void){
     printk("<5>hello world load modules\n");
    return 0;
}

void clearupmodule(void)
{
    printk("<5>clear modules\n");
}

module_init(startmodule);
module_exit(clearupmodule);       
很基本的一个
makefile是
obj-m += hello.o

我用跟你同一类型的方法编译模块

发现make能正常找到源代码树下的makefile
但是他要报出很多错误 是关于头文件的
编译没有成功
请问这个是为什么啊~
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-5-18 23:12:06 | 显示全部楼层
我还没有读完Make的使用手册,所以,你的make文件中:obj-m += hello.o,我搞不清+= 和:=的区别。这个就不说了。

我用的是debian etch 和 sarge。
我在安装内核源码之后,发现它的源码包中,并不含有头文件。也没有.config,好像倒是有Makefile。

证据是:
我在编译的时候,一开始也是报一大堆的错,可能有上百行,都是“这个头文件没有”,“那个定义没有”。后来,我把头文件目录下的所有文件,都拷贝到源码目录中,这样做实际就是把头文件都加到源码中了。后来再编译,就没有关于头文件的错误了。

注意: /usr/src下面,有两个头文件目录,一个是 linux-headers-2.6.15-1-686 ,一个是linux-headers-2.6.15-1 ,它们中的头文件是不全相同的。都需要拷贝到源码目录中。


所以,你先看看你的源码目录中有没有头文件。其它,我们再讨论。

另外,兄弟你看的是什么书。我看的LDD3,以后有什么疑问,我们可以互相讨论一下。
回复 支持 反对

使用道具 举报

发表于 2006-5-19 17:15:34 | 显示全部楼层
Makefile中的“+=”表示在某个变量的原有值基础上再增加其它内容。如:
OBJ = a.o
OBJ += b.o
则OBJ的内容应该是a.o b.o。
至于”:=“的作用,暂时记不清了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-5-20 23:57:02 | 显示全部楼层
谢谢斑竹的回答。

今天,重新安装了一遍etch,又编译了一下那个hello,world的模块。奇怪的是,这次没有经过编译内核这一步,编译模块也成功了。估计和我 先 apt-get install build-essential 有关。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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