GDB: Findind каждый переход к адресу
Я пытаюсь понять небольшой двоичный файл, используя gdb, но я не могу найти способ добиться этого: как найти список переходов, которые указывают на указанный адрес? У меня есть небольшой набор инструкций в разобранном коде, и я хочу знать, как он называется. Сначала я подумал о поиске соответствующей инструкции в.text, но поскольку существует много видов переходов, и адрес может быть относительным, это не может работать.
Есть способ сделать это?
В качестве альтернативы, если я поставлю точку останова на этот адрес, есть ли способ узнать адрес предыдущей инструкции (в данном случае, переход)?
1 ответ
Если это какая-то подпрограмма, вызываемая из других мест, то она должна уважать некоторый ABI, пока она вызывается. В зависимости от используемого процессора, адрес возврата (и, следовательно, место, откуда он был вызван) будет храниться где-то (в стеке или в некоторых регистрах). Если вы замените исходный код тем, который проверяет это, вы можете создать список адресов возврата. Или проще, как вы предложили, если вы используете gdb и ставите точку останова в этой подпрограмме, вы можете увидеть, откуда она была вызвана, с помощью команды bt.
Если это был настоящий прыжок (в отличие от "перехода к подпрограмме"), который привел вас туда (что я сомневаюсь, если он вызывается из разных мест, если это не вид longjmp/setjmp), то вы, вероятно, не сможете определить, где это было вызвано, если только используемый вами процессор не позволяет каким-либо образом отслеживать выполнение.