Я пытаюсь вычислить смещение от начала стека до текущего указателя стека.Как получить основную базу стека из/proc/[pid]/maps?
Когда я прочитал/Proc/[PID]/карты Я вижу
befdf000-bf000000 rwxp 00000000 00:00 0 [stack]
0xbefdf000 выглядит как старт стека адрес. Проблема в том, что когда я смотрю на регистр SP в gdb, фактический указатель стека - это что-то вроде 0xbefff440.
Стек растет с высоких адресов до более низких, но 0xbefff440 составляет> 0xbefdf000, как возможно, что фактический указатель стека выше, чем самый высокий адрес стека из/proc/*/maps?
В соответствии с функцией проверки памяти gdb функция высочайшего считываемого адреса стека равна 0xbeffffff, и это похоже на начало реального стека, но что такое befdf000 в файлах proc? Если это не реальная база стека, то как получить 0xbeffffff (который может быть изменен с помощью ASLR) из/proc /?
Я запускаю тесты на ARM Debian в qemu. Я отключил ASLR, поэтому адрес стека не изменяется между разными прогонами программы.
Но нет диапазона befdf000-bf000000 согласно/proc/*/maps? 0xbefff440 не находится в диапазоне befdf000-bf000000, и это меня смущает – user554738
Ум, да. 0xbf000000 - это адрес сразу после 0xbeffffff, а 0xbefff440 - немного ниже. Диапазоны выражаются в виде полуоткрытых интервалов, поэтому «0xbefdf000-0xbeffffff» означает все адреса x с «0xbefdf000 <= x <0xbeffffff», но поскольку данный адрес не соответствует границе, которая в любом случае не имеет значения. –
О, спасибо. Я был невнимателен и думал, что первый адрес выше, я не заметил, что второй адрес b ** F ** 000000 Я думал, что это b ** E ** 000000 – user554738