Linux多源内核模块编译后modinfo信息带前缀的版本差异问题求助
问题
我尝试通过多个源文件编译单个Linux内核模块,使用的Makefile如下:
obj-m := mymodule.o mymodule-y := mymodule_a.o mymodule_b.o mymodule_c.o all: $(MAKE) -C $(KERNELDIR) M=$(PWD) modules clean: $(MAKE) -C $(KERNELDIR) M=$(PWD) clean
编译成功后,modinfo的输出不符合预期:许可证、作者、参数等信息均带有“mymodule.”前缀,示例输出如下:
mymodule.description: mymodule driver mymodule.author: myname mymodule.license: GPL
预期输出应为:
description: mymodule driver author: myname license: GPL
我发现使用内核版本5.19编译时无此问题,但使用5.4版本编译时会出现该前缀。尝试了多种方法(不生成中间.o文件、直接添加到obj-m等),均无法解决问题。请问为何该前缀仅在特定内核版本出现,如何解决?
原因分析
这是Linux内核Kbuild构建系统的版本行为差异导致的:
- 5.4及更早版本的Kbuild,当使用
mymodule-y这种多源文件聚合方式构建模块时,会将模块元数据(license、author等)与模块名绑定,自动为元数据项添加模块名前缀。 - 5.19版本的Kbuild优化了元数据处理逻辑,针对多源文件聚合的模块,会自动剥离模块名前缀,直接输出标准的元数据项格式。
本质是旧版本Kbuild未区分单源文件模块和多源文件聚合模块的元数据输出规则,新版本补全了这一逻辑。
解决方法
针对5.4内核版本,有两种可靠的解决方式:
方法一:修改代码中的元数据定义
在模块代码中,用MODULE_INFO()宏替代传统的MODULE_LICENSE()、MODULE_AUTHOR()等宏,显式指定元数据项的名称,绕过Kbuild的自动前缀添加逻辑:
MODULE_INFO(license, "GPL"); MODULE_INFO(author, "myname"); MODULE_INFO(description, "mymodule driver");
这种方式在新旧内核版本中都能得到一致的modinfo输出。
方法二:调整Makefile的构建写法
将mymodule-y替换为mymodule-objs,部分旧版本Kbuild对-objs的处理逻辑与-y不同,不会给元数据添加前缀:
obj-m := mymodule.o mymodule-objs := mymodule_a.o mymodule_b.o mymodule_c.o all: $(MAKE) -C $(KERNELDIR) M=$(PWD) modules clean: $(MAKE) -C $(KERNELDIR) M=$(PWD) clean
如果此方法无效,优先使用方法一的代码修改方案。
内容的提问来源于stack exchange,提问作者ysonishi
相关产品推荐
相关产品推荐

