Linux内核文本符号



当我查看linux内核OOPS输出时,EIP和其他代码地址的值在0xC01------范围内。在我的System.map和objdump -S vmlinux输出中,所有代码地址都至少在0xC1------以上。我的vmlinux包含调试符号(CONFIG_debug_INFO)。

当我通过串行连接(kgdb)进行调试,并使用gdb ./vmlinux加载gdb时,我再次遇到同样的问题,即我无法将$eip与System.map和objdump输出中的内容进行协调。当我在gdb中运行where时,我在堆栈上得到了一个混乱的混乱:

#0 0xC01----- in ?? ()
#1 0xC01----- in ?? ()
#2 0xC01----- in ?? ()
...

有人能就如何解决这个/这些问题提出建议吗?我主要关心的是如何将eip值从OOPS映射到System.map或objdump -S vmlinux。我知道OOPS会给我函数名和对象代码的偏移量,但我更关心前面提到的问题,以及为什么gdb不能正确显示堆栈回溯。

看起来OOPS是因为你跳到了一个不是函数的地方
这很容易导致崩溃,也会阻止调试器将地址解析为符号

您可以通过拆解此EIP周围的区域来进行检查。如果我是对的,那么它作为机器代码就没有意义了。

造成这种情况的原因通常有两个:
1.使用损坏的函数指针进行函数调用。在这种情况下,最后一个之前的堆栈帧应该显示调用者。但你没有这个框架,所以这可能是另一个原因。2.堆栈溢出-您的返回地址已损坏,因此您返回到了错误的位置。如果是这样,ESP指向的数据应该包含EIP中的地址。调试堆栈溢出很困难,因为缺少最重要的信息源。您可以尝试以"原始"格式(x/xa-addr)打印堆栈,并尝试理解它。

最新更新