kallsyms 是否具有内核函数的所有符号?

qya*_*ing 5 c linux kernel

在 Linux 内核中,我想探测内核函数effective_prio()。它定义为static。当我去搜索它的符号时,kallsyms我找不到它。是否kallsyms具有内核函数的所有符号?如果没有,哪些符号不包括在内?

mdd*_*mdd 5

函数没有出现在 中有两种可能/proc/kallsyms

  1. 如果函数被标记为static,并且编译器决定内联该函数(带或不带inline关键字)
  2. 如果配置选项或其他#define选项从编译中删除函数,例如:

    #ifdef CONFIG_OPT
    void foo(void) {
    }
    #endif
    
    Run Code Online (Sandbox Code Playgroud)

据我所知,如果一个函数没有出现在 中/proc/kallsyms,则不可能从模块中调用或探测它。但是,/proc/kallsyms包含内核的所有功能,而不仅仅是通过EXPORT_SYMBOL/导出的功能EXPORT_SYMBOL_GPL


Lev*_*usa -1

kallsyms 仅列出 EXPORT_SYMBOL 和 EXPORT_SYMBOL_GPL 宏导出的符号。

这样做是为了安全。我们通常不希望模块能够访问例如内部或安全功能。这些只是违背了让内核模块尽可能安全,但允许它们尽可能多地做事的想法。

  • 是的,它们不能直接在内核模块等中使用。但是,仍然可能需要在这些模块上放置 Kprobe,例如出于跟踪或调试目的等,因此有时需要有关非导出符号的信息。事实上,我这样做是为了调试。 (3认同)