我有 3 个相互依赖的外部内核模块。更具体地说,C 包含来自 B 的符号,而 B 又包含来自 A 的符号。
我尝试按以下顺序构建模块。
make -C <Kernel dir>
make -C <kernel dir> KERNELRELEASE=$(KERNEL_VER) modules
make -C <kernel dir> KERNELRELEASE=$(KERNEL_VER) INSTALL_MOD_PATH=$(INSTALL_PATH) modules_install
make -C <kernel_dir> M=<module_A_dir> modules;
make -C <kernel_dir> M=<module_A_dir> INSTALL_MOD_PATH=$(INSTALL_PATH) modules_install;
make -C <kernel_dir> M=<module_B_dir> modules;
make -C <kernel_dir> M=<module_B_dir> INSTALL_MOD_PATH=$(INSTALL_PATH) modules_install;
make -C <kernel_dir> M=<module_C_dir> modules;
make -C <kernel_dir> M=<module_C_dir> INSTALL_MOD_PATH=$(INSTALL_PATH) modules_install;
编译模块 B 时,在 modpost 过程中,无法识别模块 A 导出的符号,声称它们未定义。
消息如下:
make[2]: Entering directory '/home/user/workingdir/kernel/linux-5.4.x'
Building modules, stage 2.
MODPOST 1 modules
ERROR: "backport_dependency_symbol" [/home/user/workingdir/extModB/moduleB.ko] undefined!
ERROR: "cfg80211_moduleA_cmd" [/home/user/workingdir/extModB/moduleB.ko] undefined!
我知道我可以简单地将 Module.symvers 从 A 包含到 B 中,但有一个问题。模块A的许可证是(GPL),而B的模块许可证是(BSD/GPL),但许可证C是(专有)。如果简单地配置
KBUILD_EXTRA_SYMBOLS
以包含其他模块目录中的 Module.symvers,我将在编译时遇到许可证问题。
所以我的问题是,有没有办法安装外部模块A,以便在编译内核模块B时,在modpost阶段,它会自动识别
INSTALL_MOD_PATH
内的模块A?
在检查了openwrt之后,它做了一些非常愚蠢的事情,即删除模块A中存在的include/mac80211-backport/linux/module.h,当编译模块B时,不知怎的,modpost不会抱怨“backport_dependency_symbol”不是定义。
关于其他“cfg80211_moduleA_cmd”,我只需在 module_B Makefile 上添加 KBUILD_EXTRA_SYMBOL=/Module.symvers 即可解决该问题。
如果我这样做,当模块C编译时,它不会寻找backport_dependency_symbol,这意味着不会因为使用专有许可证而出现构建错误。不确定在向后移植上删除 module.h 文件时一切都会神奇地发生,但现在就可以了。