【问题标题】:Why does my /proc/kallsyms file not contain all the symbols in System.map?为什么我的 /proc/kallsyms 文件不包含 System.map 中的所有符号?
【发布时间】:2020-07-28 16:33:49
【问题描述】:

我从this SO post 看到/proc/kallsyms 应该有动态加载模块的符号以及静态代码,而System.map 只包含静态代码的符号。但是,当我cat /proc/kallsyms 我似乎在内核的文本部分中只有符号(Tt 标志)时,保存一两个符号,如

0000000000000000 D irq_stack_union
0000000000000000 D __per_cpu_start

另一方面,在 System.map 中,我有来自许多部分的符号 - 基本上来自 /proc/kallsyms 的所有内容,除了加载的内核模块符号。

为了显示这种差异的大小,我使用了wc 命令。

user@debian:~/$ cat /boot/System.map-3.2.0-4-amd64 | wc
  51256  153768 2117121
user@debian:~/$ cat /proc/kallsyms | wc
  29336   92637 1161409

造成这种差异的原因是什么?我的/proc/kallsyms 文件中所有与数据部分相关的符号在哪里?

编辑:根据要求,这里是kallsyms 配置选项。

user@debian:~$ cat /boot/config-3.2.0-4-amd64 | grep KALLSYMS
CONFIG_KALLSYMS=y
# CONFIG_KALLSYMS_ALL is not set

【问题讨论】:

  • 这能回答你的问题吗? System.map file and /proc/kallsyms
  • 谢谢,但不是。那是我上面链接的帖子。我知道为什么以及如何 kallsymsSystem.map 由于该帖子而有所不同,但我的问题反映了与该帖子不同的情况。
  • 对此感到抱歉.. 我的猜测是 /proc/kallsyms 源自用于打印 opps 消息的内部数据结构,因此它从来没有理由将符号的地址存储在 .文本部分。内核实际上并没有将非文本符号保存在内存中。
  • 使用sudo cat 有什么改变吗?另外,uname -r 命令的输出是什么?
  • 嗨@MarcoBonelli 使用sudo 不会改变任何东西。 uname -r 的输出是 3.2.0-4-amd64

标签: linux linux-kernel symbols kbuild


【解决方案1】:

您没有将CONFIG_KALLSYMS_ALL 设置为y,因此只有文本符号会导出到/proc/kallsyms。将其设置为y 并重新构建内核(虽然不是那么简单)应该可以解决问题。

我不知道这是否是因为您有一个旧内核或某个发行版在其构建中禁用了它。您也可以尝试升级到较新的内核。在我的 Debian 9 Linux v4.9 中,它似乎已启用。

【讨论】:

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