我正在开发一个相当复杂的闭源内核模块,如果不将许可证设置为 GPL,我无法使用某些工具链来编译它。
modpost
抱怨使用特定的 GPL 符号 lockdep_init_map_type()
。 Grepping 模块源显示没有命中,我无法确定如何使用该符号。 (我什至不知道它通常是用来做什么的。)
Linux v6.1.42 对应的工具链是 Buildroot 工具链。适用于 Linux v6.1.87 的工具是 crosstools-ng 工具。
如何找出为什么相同的源代码没有为两个内核版本构建为“专有”版本?
如何判断两个内核版本之间哪些符号从非 GPL 更改为 GPL?
如果我不直接使用 GPL 符号,为什么
modpost
会抱怨?
注意: lockdep_init_map_type 在两个内核版本中都被声明为 EXPORT_SYMBOL_GPL。
就我而言,罪魁祸首是 sema_init。 sema_init->lockdep_init_map->lockdep_init_map_type
由于所有这些函数都在标头中声明静态内联,因此没有 GPL 就无法使用信号量。
我通过 grep 输出 .o 文件并反汇编包含 lockdep_init_map_type 命中的文件找到了这一点。
然后我找到了有问题的函数,并开始注释掉源代码的各个部分,直到找到有问题的源代码行。可能有更好的方法来做到这一点......但我不知道。
知道哪一行导致问题并不能解释为什么它在某些条件下编译。从上面收集的信息来看,我预计任何使用 sema_init 的代码都需要 GPL。
发生的情况是,对于编译 arch 的版本,信号量的实现方式不同,并且 lockdep_init_map 被声明为不执行任何操作的宏。即不调用 lockdep_init_map_type...
我通过从 objectfile.o.cmd 文件获取编译命令并使用 -E (仅预处理)运行 gcc 并检查输出来发现这一点。
原来有一个定义 CONFIG_LOCKDEP,它在某些配置下打开 lockdep_init_map_type 的使用。