我写了一个简单的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
出了什么问题,我应该如何纠正它,以便我成功编译模块?
答案 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