【问题标题】:Does kallsyms have all the symbol of kernel functions?kallsyms 是否具有核函数的所有符号?
【发布时间】:2013-12-10 09:20:51
【问题描述】:

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

【问题讨论】:

  • 我认为那里只列出了导出的符号(用EXPORT_SYMBOLEXPORT_SYMBOL_GPL 等定义的符号)。
  • 不,kallsyms 列出了所有函数,而不仅仅是导出的函数。实际上,它不知道导出或未导出的函数。它区分全局函数(在/proc/kallsyms 中标记为“T”)和局部(静态)函数,标记为“t”。但是,如果某个函数由于某些编译器优化而总是被内联甚至省略,那么它可能根本不会出现在 kallsyms 中。
  • 您搜索过确切的名称吗?因为,由于一些编译器的优化,例如,符号的真实名称也可能变成'effective_prio.isra.8',或者类似的东西。
  • 谢谢。但是我没有看到像“effective_prio.isra.8”这样的符号。我尝试了内核3.2和3.12。在源代码中,你可以找到定义在/kernel/sched.c 文件。
  • 是的,在我们的内核 3.10 的 ROSA linux 系统的 /proc/kallsyms 中也没有列出它。 AFAIK,它只在一个地方使用,在set_user_nice() function 中,它是静态的,所以编译器很可能只是将它内联到 set_user_nice() 中并且根本没有为它创建不需要的符号。这可以解释它在 kallsyms 中的缺失。接下来要做什么取决于您实际要完成的工作。

标签: c linux kernel


【解决方案1】:

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

  1. 如果函数被标记为static,并且编译器决定内联函数(带或不带inline关键字)
  2. 如果配置选项或另一个 #define 删除了正在编译的函数,例如:

    #ifdef CONFIG_OPT
    void foo(void) {
    }
    #endif
    

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

【讨论】:

    【解决方案2】:

    CONFIG_KALLSYMS_ALL=y 也需要查看非静态变量,例如:

    grep sysctl_sched_nr_migrate /proc/kallsyms
    

    定义为:

    const_debug unsigned int sysctl_sched_nr_migrate = 32;
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 哪个提交如此强化了它?至少到内核 3.10.x,它同时显示导出和未导出的函数。出于安全原因,/proc/kallsyms 可能会在非 root 用户查看时将 0 显示为这些函数的地址,但至少列出了所有函数名称。
      • 他不能使用未导出的符号,所以这有点无关紧要。
      • 是的,它们不能直接在内核模块等中使用。但是,仍然可能需要在这些模块上放置一个 Kprobe,例如,用于跟踪或调试等目的,所以信息有时需要关于非导出符号的信息。实际上,我这样做是为了调试。
      • 正如@Eugene 评论的那样,这个答案是不正确的。 kallsysms 列出内核映像的所有符号,而不仅仅是导出的符号。
      猜你喜欢
      • 2016-01-03
      • 2016-04-14
      • 2018-11-10
      • 2020-07-28
      • 1970-01-01
      • 2021-07-05
      • 2012-02-07
      • 2015-01-27
      • 1970-01-01
      相关资源
      最近更新 更多