编译Linux Hello World内核模块提示missing MODULE_LICENSE()报错
外部内核模块编译问题解答
编译时切到内核源码目录的原因
你Makefile中使用的构建命令make -C /lib/modules/$(KVERSION)/build M=$(PWD) modules里,-C参数的作用是指定make执行构建规则的工作目录。/lib/modules/5.14.0/build不是普通目录,是你执行make modules_install时自动生成的软链接,默认指向你编译对应版本内核时使用的源码路径,也就是你看到的/home/parallels/linux-5.14。
外部模块编译必须依赖匹配版本内核的构建脚本、头文件、内核编译配置,这个跳转是内核模块编译的标准流程,属于正常现象,不是配置错误。
missing MODULE_LICENSE() 报错修复
这个报错和模块复杂度无关,是Linux 2.6版本之后内核强制要求的声明规则,哪怕是最简的Hello World模块也必须添加,不需要修改源码文件名或者编译目标名,直接在hello.c中补充许可证宏声明即可。
修改后的完整hello.c代码如下:
#include <linux/module.h> /* 所有内核模块必须引入 */ #include <linux/kernel.h> /* printk、KERN_INFO 相关定义 */ /* 补充许可证声明,使用GPL许可证和内核本身许可证兼容,不会触发许可冲突 */ MODULE_LICENSE("GPL"); int init_module(void) { printk(KERN_INFO "Hello world 1.\n"); /* * 返回非0值代表模块初始化失败,无法被加载 */ return 0; } void cleanup_module(void) { printk(KERN_INFO "Goodbye world 1.\n"); }
修改完源码后,先执行make clean清理之前编译产生的残缺中间文件,再执行make即可正常编译生成hello.ko内核模块文件。
补充说明:修改文件名后触发的
no rule to make target错误,是因为修改文件名后,Makefile中obj-m = hello.o配置和实际存在的源文件名不匹配导致的,和许可证报错本身没有关联。
内容的提问来源于stack exchange,提问作者the_midnight_developer
相关产品推荐
相关产品推荐

