内核模块编译Makefile报错求助
别着急,我来帮你一步步排查这个问题~从你给出的报错信息来看,核心问题是Makefile找不到你的module.c源文件,咱们从最基础的地方开始检查:
先确认源文件名完全匹配
你的Makefile里写了obj-m += module.o,这意味着编译系统会去找对应的module.c文件来生成.o目标文件。你可以去/home/fw/Documents/Workshop_in_Information_Security目录下看看:- 源文件是不是真的叫
module.c?有没有大小写错误(比如写成Module.c)?有没有拼写失误? - 用
ls命令列一下目录内容,确认这个文件确实存在。
- 源文件是不是真的叫
检查Makefile和源文件的位置
你运行make命令的时候,必须确保当前工作目录就是module.c和Makefile所在的目录。可以先执行pwd命令查看当前路径,再用ls确认这两个文件都在当前目录里。核对Makefile的格式(这个是新手常踩的坑!)
Make对缩进的要求非常严格:all:和clean:后面的命令行必须用Tab键缩进,绝对不能用空格!你提供的Makefile看起来格式可能有问题,正确的写法应该是这样:obj-m += module.o all: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules clean: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean注意看
make前面的缩进是Tab,不是空格。确认编译依赖是否安装完整
虽然这次的报错不是依赖问题,但还是要确保你已经装了必要的工具:
执行sudo apt install linux-headers-$(uname -r) build-essential,安装内核头文件和基础编译工具包。
另外,顺便提醒一下,你的内核模块源文件里记得要包含必要的头文件,还要加上许可证声明,比如:
#include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> MODULE_LICENSE("GPL"); // 必须加这个,否则可能编译报错或加载模块时出问题 static int __init nf_minifirewall_init_function(void) { // 你的初始化代码 return 0; } static void __exit my_module_exit_function(void) { // 你的退出代码 } module_init(nf_minifirewall_init_function); module_exit(my_module_exit_function);
如果上面的步骤都检查过还是没解决问题,可以把你目录下的文件列表(执行ls -l的输出)贴出来,我们再进一步排查~
备注:内容来源于stack exchange,提问作者Its me




