You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux 5.X内核多文件模块MODULE_LICENSE已定义但modpost检测缺失报错

问题原因

核心是Makefile的Kbuild配置不符合新版内核的编译规则,具体如下:

  • Linux内核Kbuild系统对多文件模块的编译有明确逻辑:当通过<模块名>-objs显式指定模块的组成目标文件列表时,Kbuild只会编译、链接列表内明确列出的目标文件,不会自动将与模块同名的.c文件加入编译流程。
  • 当前配置中obj-m += main.o声明最终生成main.ko模块,同时main-objs := util.o告知Kbuild该模块仅由util.o链接而成,直接导致写有MODULE_LICENSE()的main.c完全没有被编译,许可证标记自然不存在,modpost扫描时必然报错。从编译日志也能验证该问题:整个编译过程只有CC [M] util.o的记录,没有编译main.c的步骤,直接将util.o链接为了main.o。
  • CentOS 6/7搭载的3.x及更早版本内核的Kbuild存在非规范兼容逻辑:即使<模块名>-objs未列出同名目标文件,也会默认将同名.c编译后加入链接,因此旧环境可侥幸编译通过。该兼容逻辑在4.x之后版本的内核中被移除,Kbuild严格按照objs列表执行链接,因此5.x内核的CentOS 8/9会直接报错。
  • 额外规则:多文件模块的组成目标文件不能和模块本身同名,否则编译时会出现目标文件覆盖冲突。
修复方法

两种方案任选其一即可:

方案1(改动最小,推荐)

重定义入口源文件名避免和模块名冲突,同步更新Makefile的目标列表:

  1. 将包含module_init、MODULE_LICENSE的main.c重命名为main_core.c(名称可自定义,只要不与模块名重名即可)
  2. 修改Makefile内容如下:
main-objs := main_core.o util.o
obj-m += main.o

build:
	make -C /lib/modules/`uname -r`/build M=`pwd` modules

clean:
	make -C /lib/modules/`uname -r`/build M=`pwd` clean

修改后重新编译即可,编译过程会依次编译main_core.o、util.o再链接为main.o,modpost可正常检测到MODULE_LICENSE标记。

方案2

修改最终生成的模块名,避免和入口源文件重名,无需改动现有C文件名:
例如将模块名改为mymod,对应Makefile修改为:

mymod-objs := main.o util.o
obj-m += mymod.o

build:
	make -C /lib/modules/`uname -r`/build M=`pwd` modules

clean:
	make -C /lib/modules/`uname -r`/build M=`pwd` clean

修改后最终生成mymod.ko模块,加载时使用modprobe mymod即可。

内容的提问来源于stack exchange,提问作者daisy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 19:09:31