Debian 9下编译内核模块报错求助:/build目录为空无Makefile
解决Debian 9编译内核模块时的"No rule to make target 'modules'"错误
首先,核心问题出在你的/lib/modules/4.9.0-5-amd64/build目录是空的——这说明你安装的内核头文件没有正确部署,或者这个目录的符号链接指向了错误的路径。咱们一步步来修复:
1. 重新安装并修复内核头文件
先彻底清理现有可能损坏的头文件,再重新安装:
sudo apt-get purge linux-headers-4.9.0-5-amd64 sudo apt-get autoremove --purge sudo apt-get install linux-headers-$(uname -r)
安装完成后,检查build符号链接是否正确指向了实际的头文件目录:
ls -l /lib/modules/$(uname -r)/build
正常情况下,输出应该是类似这样的:
lrwxrwxrwx 1 root root 36 Aug 1 10:00 /lib/modules/4.9.0-5-amd64/build -> /usr/src/linux-headers-4.9.0-5-amd64
如果链接不存在或者指向错误,手动创建正确的链接:
sudo ln -sf /usr/src/linux-headers-$(uname -r) /lib/modules/$(uname -r)/build
2. 修复你的内核模块代码和Makefile
除了头文件的问题,你的代码和Makefile还有两个小细节需要修正:
代码中的语法错误
在你的C代码里,MODULE_VERSION("1.0")这一行末尾缺少分号,会导致编译失败,修改后应该是:
#include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> MODULE_LICENSE("GPL"); MODULE_AUTHOR("Homer S."); MODULE_DESCRIPTION("hmmmm ..."); MODULE_VERSION("1.0"); static int __init start(void) { printk(KERN_INFO "\nCHELLAS!\n\n"); return 0; } static void __exit end(void) { printk(KERN_INFO "\nCIAO!\n\n"); return; } module_init(start); module_exit(end);
Makefile的缩进问题
Makefile要求命令行必须用Tab键缩进(不能用空格),检查你Makefile里的all和clean目标下的make -C ...行,确保它们是用Tab缩进的。正确的Makefile应该是:
obj-m+=foo.o KVERSION=$(shell uname -r) all: make -C /lib/modules/$(KVERSION)/build M=$(PWD) modules clean: make -C /lib/modules/$(KVERSION)/build M=$(PWD) clean
3. 重新编译验证
完成以上修复后,回到你的模块目录,重新执行:
make
如果一切正常,应该会生成foo.ko文件,之后就可以用sudo insmod foo.ko加载模块,用dmesg查看内核打印的信息了。
内容的提问来源于stack exchange,提问作者Sven Hager
相关产品推荐
相关产品推荐

