【问题标题】:How to get actuall stack base from /proc/[pid]/maps?如何从 /proc/[pid]/maps 获取实际的堆栈库?
【发布时间】:2016-07-03 13:20:41
【问题描述】:

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

当我阅读 /proc/[pid]/maps 我看到

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

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

堆栈从高地址向低地址增长,但 0xbefff440 大于 0xbefdf000,实际堆栈指针怎么可能高于 /proc/*/maps 的最高堆栈地址?

根据 gdb 内存检查函数,最高可读堆栈地址是 0xbeffffff,这看起来像是真正的堆栈开始,但是 proc 映射中的 befdf000 是什么?如果它不是真正的堆栈库,那么如何从 /proc/ 获取 0xbeffffff(启用 ASLR 时可能会发生变化)?

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

【问题讨论】:

    标签: linux


    【解决方案1】:

    我不明白你在问什么。大概你的数学是错误的。 0xbefff440 在 0xbefdf000 到 0xbeffffff 的范围内,接近预期的范围顶部。

    【讨论】:

    • 但是根据 /proc/*/maps 范围不是 befdf000-bf000000 吗? 0xbeff440 不在 befdf000-bf000000 范围内,这让我很困惑
    • 嗯,是的。 0xbf000000 是紧跟在 0xbeffffff 之后的地址,而 0xbefff440 则略低于该地址。范围表示为半开区间,因此0xbefdf000-0xbeffffff 表示所有地址 x 与0xbefdf000 <= x < 0xbeffffff,但由于所讨论的地址不在边界上,所以无论如何都没关系。
    • 哦,谢谢。我一不留神,以为第一个地址更高,我没有注意到第二个地址是bF000000 我以为是bE000000
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-04-08
      • 2015-01-10
      • 2013-02-05
      • 2010-11-26
      • 2022-01-02
      • 1970-01-01
      • 1970-01-01
      • 2015-12-15
      • 1970-01-01
      相关资源
      最近更新 更多