【发布时间】:2013-12-10 09:20:51
【问题描述】:
在Linux内核中,我想探测内核函数effective_prio()。它定义为static。
当我在 kallsyms 中搜索它的符号时,我找不到它。 kallsyms 是否具有内核函数的所有符号?如果不是,哪些符号不包括在内?
【问题讨论】:
-
我认为那里只列出了导出的符号(用
EXPORT_SYMBOL、EXPORT_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 中的缺失。接下来要做什么取决于您实际要完成的工作。