为什么我的 /proc/kallsyms 文件不包含 System.map 中的所有符号?

Why does my /proc/kallsyms file not contain all the symbols in System.map?

我从看到/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

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

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