多源文件可加载内核模块编译后加载无dmesg输出问题求助
问题根因
当你在Kbuild配置中声明了multiFileKo-y规则时,Kbuild会默认将multiFileKo.o识别为多目标链接生成的复合对象,不会再自动从multiFileKo.c编译得到该对象。你之前的配置仅将helpers.o加入依赖列表,没有把主逻辑对应的对象加入,最终生成的内核模块根本不包含模块初始化、退出的相关代码,自然不会输出预期日志。
单文件编译时没有声明multiFileKo-y,Kbuild会自动从multiFileKo.c编译得到multiFileKo.o再打包为ko文件,因此运行正常。
正确配置方案
方案1:调整主源文件名(推荐,符合Kbuild命名规范)
- 将主逻辑源文件
multiFileKo.c重命名为main.c(或其他和最终模块名不重名的名称) - 修改Kbuild配置为:
obj-m := multiFileKo.o multiFileKo-y := main.o helpers.o
方案2:直接声明全量依赖
如果不想修改主源文件名,直接把主逻辑的对象也加入依赖列表即可。注意modulename-objs是内核Kbuild官方支持的复合模块依赖声明写法,和普通主机程序Makefile的规则无关,和modulename-y在内核构建体系下功能等价:
obj-m := multiFileKo.o multiFileKo-objs := multiFileKo.o helpers.o
验证方式
编译完成后可执行nm multiFileKo.ko检查符号表,确认存在init_module、cleanup_module相关符号即可。
内容的提问来源于stack exchange,提问作者Roman
相关产品推荐
相关产品推荐

