如何为Linux 5.6及以上版本内核提供自定义Module.symvers文件
Linux 5.6+ 跨模块依赖导出符号的构建方案
失效根因
从你提供的5.4和5.6版本内核构建脚本对比可以明确:Linux 5.6版本移除了MODPOST调用参数中的-I $(modulesymfile)配置项,因此构建外部模块时,内核构建系统不再自动读取当前构建目录下的Module.symvers文件,原有依赖本地自定义Module.symvers的方案自然失效。
正确实现方式
内核官方保留了KBUILD_EXTRA_SYMBOLS变量用于该场景,只需要将被依赖模块生成的Module.symvers文件的绝对路径赋值给该变量即可,支持同时指定多个路径,路径间用空格分隔。
使用方式
编译时临时指定
构建依赖模块时直接在make命令中追加变量声明,示例如下:# 假设被依赖模块的Module.symvers路径为 /opt/modules/parent_module/Module.symvers make -C /lib/modules/$(uname -r)/build M=$(pwd) KBUILD_EXTRA_SYMBOLS=/opt/modules/parent_module/Module.symvers modules写入Makefile固化配置
也可以直接在依赖模块的Makefile中提前声明该变量,避免每次手动输入:# 追加被依赖模块的symvers路径,多个依赖依次追加即可 KBUILD_EXTRA_SYMBOLS += /opt/modules/parent_module/Module.symvers # KBUILD_EXTRA_SYMBOLS += /opt/modules/other_module/Module.symvers all: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules clean: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
注意事项
- 被依赖模块的
Module.symvers必须是和当前构建使用的内核版本、编译配置完全一致的环境下生成的,否则会出现CRC校验不匹配的警告,模块加载时也会报错。 - 该方案不会修改系统内核的任何原有文件,不会污染构建环境,是官方推荐的长期可行方案。
内容的提问来源于stack exchange,提问作者Alexey Godin
相关产品推荐
相关产品推荐

