Module 在linux中编译内核模块时遇到问题

Module 在linux中编译内核模块时遇到问题,module,linux-kernel,kernel-module,kernel,Module,Linux Kernel,Kernel Module,Kernel,我编写了一个简单的helloworld内核模块。我编写了一个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编译了模块。效果很好 然后,最近当内核

我编写了一个简单的helloworld内核模块。我编写了一个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.
我检查了一下,发现在/arch/x86/tools/上有一个relocs的可执行文件,但没有relocs.c

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

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


我的问题可能看起来很傻,但我不明白那是什么“32”?它不是应该是“24”吗?

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

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

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

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

遵循以下步骤:

$sudo apt获取更新

$sudo apt获取安装linux源代码


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

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


像charm一样工作

我认为问题来自Makefile。 我以前遇到过此问题,您应该删除轨迹空间并替换为选项卡,\t这样就可以了。希望这有帮助


可能是Makefile语法。

我遇到了与您相同的问题。我通过在Makefile中替换您的build命令修复了此问题

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

@是的,我是通过Windows操作系统上网的。所以,为了得到准确的错误词,我在互联网上搜索了它并进行了复制粘贴。你是对的,这是另一件奇怪的事情,我从你的makefile中了解到,你只包括“headers”文件夹来编译你的模块,你确定源文件也在该文件夹中可用吗?除非你只使用内核静态,您可能需要源文件来编译您的模块。@ye9ane…它第一次起作用,我读到的每个地方的makefile都是相同的格式。但是他们确实说我们正在根据内核源代码树“生成”内核文件(我不认为源文件应该在header文件夹中)。因此,如果您认为它应该是其他东西,请一定要写apt文件夹,如果它第一次工作正常,那就不是问题了。通过更新内核,你的意思是你用新的替换了整个源代码树吗?…你检查过以前的内核是否包含reloc.c吗?@ye9ane…以前的内核中也有相同的名为relocs的可执行文件location@itisravi..I在这里犯了一个错误,写了KDIR:…在我的makefile中是KDIR:=…关于subdir,我在这里发布之前就试过了…它不起作用