Unexporting kallsyms_lookup_name

kallsyms_lookup_name函数可以通过函数名字获取对应的地址。unexporting kallsyms_lookup_name意味着out-of-tree的驱动不能够利用kallsyms_lookup_name函数调用未导出的内核函数。

unexporting kallsyms_lookup_name可能会造成的影响如下:

  1. live patch:live patch需要kallsyms_lookup_name函数找到对应的地址以完成函数的替换。不过kpatch的维护者Joe Lawrence说明kpatch已经不再使用kallsyms_lookup_name函数。我去github看了kpatch的代码,发现:
	kpatch_set_memory_rw = (void *)kallsyms_lookup_name("set_memory_rw");
	if (!kpatch_set_memory_rw) {
		pr_err("can't find set_memory_rw symbol\n");
		return -ENXIO;
	}

	kpatch_set_memory_ro = (void *)kallsyms_lookup_name("set_memory_ro");
	if (!kpatch_set_memory_ro) {
		pr_err("can't find set_memory_ro symbol\n");
		return -ENXIO;
	}
  1. 即使unexporting kallsyms_lookup_name,仍然有很多方法可以通过内核符号调用内核函数,比如利用Kprobe,Kprobe会在内核里面调用kallsyms_lookup_name函数,可以获取到自己需要的信息。

  2. 手机设备商在内核方面能做的更少了,android Treble项目引入了一个新的“厂商接口”API:厂商特有的代码将被放到可加载模块中,因此厂商不能再修改内核。

EXPORT_SYMBOL和EXPORT_SYMBOL_GPL

EXPORT_SYMBOL这个宏是将函数导出让所有模块都可以使用,而EXPORT_SYMBOL_GPL()这个宏主要是给有GPL认证的模块使用。

EXPORT_SYMBOL标签内定义的函数对全部内核代码公开,不用修改内核代码就可以在您的内核模块中直接调用。

参考

Android 内核的开发“顽疾”如何解决?
LINUX EXPORT_SYMBOL_GPL及EXPORT_SYMBOL导出函数
五种开源协议的比较(BSD,Apache,GPL,LGPL,MIT)

你可能感兴趣的:(linux)