【问题标题】:init_task symbol not found in /proc/kallsyms (kernel 4.5.4-1-ARCH)在 /proc/kallsyms 中找不到 init_task 符号(内核 4.5.4-1-ARCH)
【发布时间】:2016-06-09 09:45:31
【问题描述】:

我正在尝试定位一个线程的task_struct 的地址。首先,我需要得到init_tasktask_struct的地址,然后我遍历整个列表,最后得到一个特定线程的task_structinit_task中的task_struct可以通过命令从/proc/kallsyms轻松获取

grep "\<init_task\>" /proc/kallsyms

这在我使用较旧的内核版本 (3.12) 时有效。但是当我切换到较新的版本(4.5)时,这个想法一开始就失败了。因为符号 init_task/proc/kallsyms 中消失了。但是当我检查源代码时,我可以看到符号init_task 被导出(http://lxr.free-electrons.com/source/init/init_task.c?v=4.5#L18)。为什么它没有出现在/proc/kallsyms 中?或者还有其他方法可以从用户空间程序中获取init_task 的地址吗?

【问题讨论】:

  • 你机器的架构是什么?有没有可能是IA64?另外,看看你的内核.config中的CONFIG_ARCH_INIT_TASK是否设置为y
  • 不,我的机器是 x86_64。而且我当前版本的内核配置文件(4.5)没有CONFIG_ARCH_INIT_TASK 选项。我还检查了旧内核版本(3.12)的.config文件,其中导出了init_task符号,也没有这样的选项。看来问题不是因为.config文件-:((
  • 您能否检查.config 中的下两个选项以获取新内核:CONFIG_UNUSED_SYMBOLSTRIM_UNUSED_KSYMS?其中一些不太可能已启用,但如果是,则可能是原因。
  • 是的,新内核有CONFIG_UNUSED_SYMBOLS=y,但没有找到TRIM_UNUSED_KSYMS 选项。据我了解,启用CONFIG_UNUSED_SYMBOLS 选项将导出未使用的符号,这意味着如果不使用init_task,无论如何都会导出它。所以这似乎不是原因。还是我误会了?
  • 是的,你的理解是正确的。我只看到您缺少 init_task() 符号的两个可能原因:1. 如果 CONFIG_ARCH_INIT_TASK=y 2. CONFIG_TRIM_UNUSED_KSYMS=y 并且符号未在内核中使用。可能有另一种机制可以去除未使用的符号,但我不知道。

标签: linux-kernel symbols


【解决方案1】:

尝试使用CONFIG_KALLSYMS_ALL 选项集进行编译。没有它kallsyms 似乎只包含来自.textinit.text 部分的符号:https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/scripts/link-vmlinux.sh#n152https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/scripts/kallsyms.c#n250

【讨论】:

    猜你喜欢
    • 2021-12-18
    • 2016-01-03
    • 2015-10-29
    • 2013-10-21
    • 1970-01-01
    • 2021-01-03
    • 2020-07-28
    • 2013-12-10
    相关资源
    最近更新 更多