Module 在linux中编译内核模块时遇到问题
我编写了一个简单的helloworld内核模块。我编写了一个make文件,如下所示: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编译了模块。效果很好 然后,最近当内核
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,我在这里发布之前就试过了…它不起作用