0

我正在尝试addr2line将“pc”寄存器值从内核oops(示例)转换为内核代码中的一行。我相信程序计数器的值代表一个虚拟地址。

现在Stack Overflow 上的这篇文章说我们通常提供 addr2line 的偏移量而不是虚拟地址。VA 只能在地址空间随机化关闭时使用。这对内核也适用吗?我相信它应该。

幻灯片 14 上的这个嵌入式 Linux 会议演讲也使用程序计数器值跳转到代码行,但我相信这只有在地址空间随机化关闭时才有效。否则,一旦虚拟内存被初始化,内核可能会被随机重定位。在这种情况下,从 oops 中选择的任何虚拟地址对 addr2line 都没有任何意义。这都是理论。我现在有两个问题:

  1. 我的理解正确吗?如果没有,请纠正我。
  2. 我们如何关闭内核的地址空间随机化,以便可以预测符号的位置?
4

1 回答 1

1

是的,你的理解是正确的。

您有多种选择:

  1. 通过使用 Drastic 解决方案构建内核来完全删除 KASLR 支持,CONFIG_RANDOMIZE_BASE=n如果不是用于开发目的,则不推荐。
  2. 使用命令行参数引导内核nokaslr。请参阅此处了解更多信息。
  3. 手动计算地址从内核.text段开始的偏移量。没那么容易,需要事先知道基地址或从恐慌信息中推断出它。绝对可以使用一些grep++objdump一些更多的 ELF 工具,但非常烦人且耗时。

注意:当然第 1 点和第 2 点需要使用调试符号编译内核addr2line才能完成其工作。

另请参阅:此 Linux 内核文档页面

于 2020-07-14T17:34:34.510 回答