如何查找内核模块中GPL符号的使用?

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

我正在开发一个相当复杂的闭源内核模块,如果不将许可证设置为 GPL,我无法使用某些工具链来编译它。

modpost
抱怨使用特定的 GPL 符号
lockdep_init_map_type()
。 Grepping 模块源显示没有命中,我无法确定如何使用该符号。 (我什至不知道它通常是用来做什么的。)

  • 我可以将该模块编译为 Linux v6.1.42 的“专有”模块
  • 我可以将模块编译为 Linux v6.1.87 的“GPL”
  • 我无法将该模块编译为 Linux v6.1.87 的“专有”模块

Linux v6.1.42 对应的工具链是 Buildroot 工具链。适用于 Linux v6.1.87 的工具是 crosstools-ng 工具。

如何找出为什么相同的源代码没有为两个内核版本构建为“专有”版本?

如何判断两个内核版本之间哪些符号从非 GPL 更改为 GPL?

如果我不直接使用 GPL 符号,为什么

modpost
会抱怨?


注意: lockdep_init_map_type 在两个内核版本中都被声明为 EXPORT_SYMBOL_GPL。

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

就我而言,罪魁祸首是 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 的使用。

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