Compilation LSM Howto:具有非导出函数的内核模块

Compilation LSM Howto:具有非导出函数的内核模块,compilation,linux-kernel,patch,linux-security-module,Compilation,Linux Kernel,Patch,Linux Security Module,我目前正在编写一个Linux内核模块,它依赖于Linux安全模块(LSM),目前还没有什么,我只想在打开文件时打印一条简单的消息。问题是:要注册到钩子,我需要函数register\u security,我在谷歌搜索后发现,它不再被导出,因此不能被可加载的内核模块使用,只能被直接编译到内核中的模块使用。 当然,这对于安全模块来说是有意义的,但对于我来说,这太糟糕了。 现在的问题是:有没有办法将我的模块修补到内核中?我的意思是,我不想在每次错误修复或每一次小的更改之后重新编译我的内核。我可以接受每次

我目前正在编写一个Linux内核模块,它依赖于Linux安全模块(LSM),目前还没有什么,我只想在打开文件时打印一条简单的消息。问题是:要注册到钩子,我需要函数register\u security,我在谷歌搜索后发现,它不再被导出,因此不能被可加载的内核模块使用,只能被直接编译到内核中的模块使用。 当然,这对于安全模块来说是有意义的,但对于我来说,这太糟糕了。 现在的问题是:有没有办法将我的模块修补到内核中?我的意思是,我不想在每次错误修复或每一次小的更改之后重新编译我的内核。我可以接受每次尝试都重新启动我的电脑,但我想重新编译可能需要一点时间


编辑:嗯,还没有:(我有一个想法,也许有人能告诉我它是好是坏:我能不能在内核源代码中为我需要的函数添加EXPORT_符号,然后重新编译它,然后将我的代码添加为一个模块?当然这只是为了测试和调试

你能不能在内核中使用
fsnotify
,或者
fanotify
r空间


导出作者认为导出不是一个好主意的函数通常不是一个好主意。如果您调用的函数不是公共接口的一部分,并且该函数有副作用,您可能会破坏某些功能。此外,您的模块不会在其他机器上工作,但您可能不关心这一点。

不,没有。如果未导出符号,内核内链接器将无法找到它。但是将导出添加到用于测试的内核应该可以。您可以通过将模块添加到./include/linux/Kbuild将其添加到导出列表中


如果在(用户模式linux)中进行测试,也可以[http://user-mode-linux.sourceforge.net/]或者在虚拟盒中,重新编译整个内核可能不是什么大问题。

这可能有点晚了,因为我不久前看到了您的问题。我发现一个好的解决方案是编写一个模块,将其编译到内核中,然后只导出两个要使用的函数

比如说

//REGISTER FILE_PERMISSION
static void k_register_file_permission(int (*my_file_permission) (struct file *file, int mask)) {
  my_file_permission_func = my_file_permission;
}
EXPORT_SYMBOL(k_register_file_permission);
然后,您可以从内核模块调用k_register_file_permission,这在开发过程中非常方便

您还需要一个函数,如

int k_file_permission (struct file *file, int mask) {
  if(my_file_permission_func == NULL) 
  {
    //do nothing
  }
  else
  {
    return my_file_permission_func(file, mask);
  }
  return 0;
}

您将在启动时向LSM注册。

是的,我知道这将是一种解决方法。但我这样做只是为了测试目的。由于我在虚拟机中测试,破坏性的东西不是问题