在linux中编译内核模块时出现问题

时间:2012-12-24 11:08:35

标签: module linux-kernel kernel-module kernel

我写了一个简单的hello world内核模块。我写的一个make文件如下:

obj -m += hello.o

KDIR: /usr/src/linux-headers-3.2.0-21-generic-pae

all:
     $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules

clean:
     rm -rf *.o *.ko *.mod.* *.symvers *.order

然后我用make编译了模块。它运作得很好。

然后,最近我在内核更新到3.2.0-24时再次'make'(当然我在KDIR中将版本更改为24)。但是出现了以下错误:

make[1]: Entering directory `/usr/src/linux-headers-3.2.0-24-generic-pae'
make[2]: *** No rule to make target `arch/x86/tools/relocs.c', needed
by `arch/x86/tools/relocs'.  Stop.

我查了一下,发现relocs的可执行文件在/ arch / x86 / tools /但是没有relocs.c

出了什么问题,我应该如何纠正它,以便我成功编译模块?

6 个答案:

答案 0 :(得分:0)

  

make [1]:进入目录   `/usr/src/linux-headers-3.2.0-32-generic-pae'

我的问题似乎很愚蠢,但我不明白那是什么'32'?是不是应该是'24'?

答案 1 :(得分:0)

应该是KDIR:=而不是KDIR:也不推荐使用SUBDIRS=。使用M=$(PWD)

答案 2 :(得分:0)

请分享您编写的hello-world模块代码。

relocs.c存在于内核src内的arch / x86 / tools下。

由于您的计算机上只安装了linux-header,因此您可能看不到relocs.c文件。 你必须下载整个内核src。

请按照以下步骤操作:

$ sudo apt-get update

$ sudo apt-get install linux-source。

作为试用版(在下载内核src之后),您可以将makefile更改为指向整个内核目录的KDIR,然后构建模块。

答案 3 :(得分:0)

在make文件中,只需将M = $(PWD)更改为M = $(shell pwd)......

像魅力一样工作

答案 4 :(得分:0)

我认为问题来自Makefile。 我以前遇到过这个问题,你应该删除跟踪空间并用tab \ t替换它就没事了。希望这有帮助。

可能是Makefile语法。

答案 5 :(得分:0)

我遇到了和你一样的问题。我通过在Makefile中替换你的build命令修复了它。

make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules