Мне нужна помощь в получении указателей инструкций (RIP) стека вызовов на 64-разрядной машине Linux. я могу пройти по стеку с помощью ptrace и получить все значения указателя кадра/базы (RBP). но поскольку мне нужны значения IP, какова арифметическая и концептуальная связь между RIP и RBP. Я предполагаю, что значение RIP хранится в месте (RBP + 8) и может быть прочитано с помощью ptrace PEEKDATA. мое предположение верно?
Связь между указателем программы/инструкции (RIP) и указателем базы/кадра (RBP) в 64-разрядной версии Linux
comment
Расположение стека вызовов зависит от соглашения о вызовах и архитектуры процессора. См. en.wikipedia.org/wiki/Call_stack и en.wikipedia.org/wiki/Calling_convention. Возможно, ptrace абстрагируется от этого, но я на самом деле не знаю.
- person Daniel Brückner   schedule 07.07.2010
Ответы (1)
Любой адрес возврата, помещенный в стек, даст вам только %rip
, начинающийся после возврата текущей выполняемой функции, а не %rip
текущей выполняемой функции. Вы должны получить доступ к текущему %rip
так же, как это делает GDB:
- В идеале ваша платформа поддерживает аргумент
PTRACE_GETREGS
илиPTRACE_GETREGSET
. Ваша справочная страница и заголовочный файл должны дать вам оставшуюся часть пути отсюда. - В противном случае вы сможете использовать аргумент
PTRACE_PEEKUSER
с соответствующим смещением, чтобы получить регистр из пользовательской области.
Подробности можно посмотреть в gdb/amd64-linux-nat.c
в дереве исходного кода GDB.
person
Jeremy W. Sherman
schedule
10.07.2010