如何从/ proc / [pid] / maps获取精确堆栈基础?

时间:2016-07-03 13:20:41

标签: linux

我试图计算从堆栈开始到当前堆栈指针的偏移量。

当我读/ proc / [pid] / maps时,我看到了

  befdf000-bf000000 rwxp 00000000 00:00 0          [stack]

0xbefdf000看起来像堆栈起始地址。 问题是,当我在gdb中查看SP寄存器时,实际的堆栈指针就像0xbefff440。

堆栈从高地址增长到更低,但0xbefff440>如果实际堆栈指针高于/ proc / * / maps中的最高堆栈地址,那么它是如何实现的?

根据gdb内存检查函数最高可读堆栈地址是0xbeffffff,这看起来像真正的堆栈启动,但proc map中的befdf000是什么?如果它不是真正的堆栈基础,那么如何从/ proc /?

获得0xbeffffff(可能会改变ASLR)

我在qemu上运行ARM Debian测试。我禁用了ASLR,因此堆栈地址在不同的程序运行之间不会发生变化。

2 个答案:

答案 0 :(得分:1)

我不明白你的要求。大概你的数学是错的。 0xbefff440在0xbefdf000到0xbeffffff的范围内,接近该范围的顶部。

答案 1 :(得分:0)

这两个地址是堆栈可以的两个边界。如果尝试执行堆栈操作会使其超出一个限制(在我们的示例中为较低或起始地址),操作系统将尝试增加堆栈段,降低低边缘以为新堆栈条目腾出空间,或者可以发送SEGV信号,以防它无法扩展堆栈(例如,如果它与程序中断AKA堆重叠)

第一次写入会写入段的最后一个字节。