【问题标题】:Alternative to the GPL *find_symbol* method in Linux kernel moduleLinux 内核模块中 GPL *find_symbol* 方法的替代方案
【发布时间】:2019-03-14 06:32:45
【问题描述】:

我有一个专有的 Linux 模块,它可能在包含函数 foo 的第二个专有模块之前或之后加载。

我希望我的第一个模块在被动态配置时查找第二个模块的符号foo,如果找到就调用它。

一般的想法(松散的语法)是这样的:

/* check if the module/symbol can be found */    
module, foo_cb = lookup_for_a_symbol("foo");

if (foo_cb && module) {
    /* increment the refcnt to make sure the module will not be unloaded */
    module_try_get(module);

    foo_cb(my_params);

    /* release the module */ 
    module_put(module);
}

我在 module.c 中找到了一个类似 find_symbol 的函数,但它是 GPL。

动态符号查找的任何非 GPL 替代方案?

谢谢。

【问题讨论】:

  • 一个很好的讨论是在Kernel symbol marked with “T” in /proc/kallsyms is not exported。它引入了kallsyms_lookup_namekallsyms_lookup,但它们也可能是 GPL。另一个相关的是Unknown symbol flush_tlb_all (err 0)
  • @jww - 是的...GPL 也是 :(
  • 可以从用户空间解析/proc/kallsyms,获取符号和模块,然后将地址发送给模块。但这似乎很hacky,而且容易出错,例如,如果模块被删除了
  • 创建一个 GPL 辅助模块,它导出一个函数(使用 EXPORT_SYMBOL 而不是 EXPORT_SYMBOL_GPL)来查找您的符号,然后可以在您的模块中使用专有许可证
  • @ItayMarom 嗯,不是真的...您只需安装两个模块,depmod 和 modprobe 会自动加载它

标签: c linux linux-kernel kernel-module


【解决方案1】:

但是您的模块不导出 GPL 符号,所以这应该不是问题。唯一的问题是,如果您希望能够在不加载 foo 的情况下加载专有模块 bar。

模块 foo 应该使用 EXPORT_SYMBOL() 来导出 bar 将使用的任何内容。

如果您需要条件动态链接,则添加第三个模块来执行此操作,它使用来自 foo 的符号调用 bar 并在 foo 和 bar 中使用 EXPORT_SYMBOL() 以使模块 foobar 可以使用必要的符号。

【讨论】:

    【解决方案2】:

    抱歉,我知道这是一个比较老的问题,但我最近有同样的需求,我使用了一个非常明显的解决方案,没有创建这里没有人提到的 GPL 帮助模块,所以我认为值得一提。

    scnprintf 不是 GPL,它支持 %pf%pF 格式,可以进行所需的符号解析。见printk formats

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-25
      • 1970-01-01
      • 2017-09-17
      • 2022-08-23
      • 1970-01-01
      相关资源
      最近更新 更多