【发布时间】: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_name和kallsyms_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