2

我写了一个简单的 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 时再次“制作”(当然我在 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.

我检查并发现在/arch/x86/tools/中有一个relocs的可执行文件,但没有relocs.c

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

4

6 回答 6

1

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

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

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

按着这些次序:

$ sudo apt-get 更新

$ sudo apt-get 安装 linux-source。

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

于 2013-01-03T05:10:02.683 回答
0

我认为问题来自Makefile。我以前遇到过这个问题,你应该删除尾随空间并用制表符替换 \t 就可以了。希望这有帮助。

它可能是 Makefile 语法。

于 2013-06-06T07:02:48.213 回答
0

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

make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules
于 2013-12-18T03:43:29.360 回答
0

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

我的问题可能看起来很愚蠢,但我不明白'32'是什么?它不应该是'24'吗?

于 2012-12-24T11:16:47.880 回答
0

应该是KDIR:=而不是KDIR:SUBDIRS= 已被弃用。利用M=$(PWD)

于 2012-12-24T11:20:46.807 回答
-1

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

像魅力一样工作

于 2013-03-12T10:35:15.727 回答