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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了kallsyms是否具有内核函数的所有符号?相关的知识,希望对你有一定的参考价值。

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

答案

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

  1. 如果函数被标记为static,并且编译器决定内联函数(使用或不使用inline关键字)
  2. 如果配置选项或另一个#define从编译中删除函数,例如: #ifdef CONFIG_OPT void foo(void) { } #endif

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

另一答案

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

grep sysctl_sched_nr_migrate /proc/kallsyms

其定义为:

const_debug unsigned int sysctl_sched_nr_migrate = 32;
另一答案

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

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

以上是关于kallsyms是否具有内核函数的所有符号?的主要内容,如果未能解决你的问题,请参考以下文章

怎么查看linux的内核符号表?

Linux 内核符号地址在 /proc/kcore 和 /proc/kallsyms 之间不匹配

/proc/kallsyms 中标有“T”的内核符​​号未导出

尝试将 /proc/kallsyms 添加到 gdb 以进行 vmlinux 调试:`/proc/kallsyms':无法读取符号:文件格式无法识别

性能:内核模块符号未显示在分析中

内核符号 __tracepoint_module_load 在哪里定义?