Связь между указателем программы/инструкции (RIP) и указателем базы/кадра (RBP) в 64-разрядной версии Linux

Мне нужна помощь в получении указателей инструкций (RIP) стека вызовов на 64-разрядной машине Linux. я могу пройти по стеку с помощью ptrace и получить все значения указателя кадра/базы (RBP). но поскольку мне нужны значения IP, какова арифметическая и концептуальная связь между RIP и RBP. Я предполагаю, что значение RIP хранится в месте (RBP + 8) и может быть прочитано с помощью ptrace PEEKDATA. мое предположение верно?


person Sandeep P    schedule 07.07.2010    source источник
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