外部内核模块如何在 modpost 期间查找导出的符号

问题描述 投票:0回答:1

我有 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?

linux-kernel linux-device-driver kernel-module
1个回答
0
投票

在检查了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 文件时一切都会神奇地发生,但现在就可以了。

© www.soinside.com 2019 - 2024. All rights reserved.