我試圖計算從堆棧開始到當前堆棧指針的偏移量。如何從/ proc/[pid]/maps獲取真正的堆棧基礎?
當我讀到的/ proc/[PID] /地圖我看
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,因此堆棧地址在不同程序運行之間不會改變。
但是根據/ proc/*/maps不是範圍befdf000-bf000000? 0xbefff440不在範圍befdf000-bf000000,這使我困惑 – user554738
嗯,是的。 0xbf000000是0xbeffffff之後的地址,而0xbefff440稍微低於此值。範圍表示爲半開區間,因此'0xbefdf000-0xbeffffff'表示所有地址x都帶有'0xbefdf000 <= x <0xbeffffff',但是由於所討論的地址在邊界處不正確,所以無論如何不重要。 –
噢,謝謝。我不留神,認爲第一個地址更高,我沒有注意到第二個地址是b ** F ** 000000我認爲它是b ** E ** 000000 – user554738