Ответ 1
Что-то вроде этого возможно?
$ objdump -S --start-address=0x42 foo.o | awk '{print $0} $3~/retq?/{exit}'
Он печатает список дисковых сборок, начиная с 0x42
, пока не найдет ret(q)
, предполагая, что граница отмечена ret(q)
Мне очень неприятно разбирать большие фрагменты кода библиотеки, чтобы получить достаточно контекста, чтобы увидеть, что вызывает крах. Есть ли способ, которым я могу просто передать objdump адрес, и найти ли он границы содержащей функции для меня?
EDIT: Еще лучше, могу ли я его разобрать целую трассировку стека для меня?
Что-то вроде этого возможно?
$ objdump -S --start-address=0x42 foo.o | awk '{print $0} $3~/retq?/{exit}'
Он печатает список дисковых сборок, начиная с 0x42
, пока не найдет ret(q)
, предполагая, что граница отмечена ret(q)
objdump --start-address=
возможно?
gdb
disassemble
gdb -batch -ex "file $EXECUTABLE" -ex "disassemble/rs $ADDRESS"
Например:
переменный ток:
#include <assert.h>
int myfunc(int i) {
i = i + 2;
i = i * 2;
return i;
}
int main(void) {
assert(myfunc(1) == 6);
assert(myfunc(2) == 8);
return 0;
}
Скомпилируйте и myfunc
чтобы найти адрес:
gcc -std=c99 -O0 -g a.c
gdb -batch -ex 'file a.out' -ex "disassemble/rs myfunc"
Выход:
Dump of assembler code for function myfunc:
a.c:
3 int myfunc(int i) {
0x000000000000064a <+0>: 55 push %rbp
0x000000000000064b <+1>: 48 89 e5 mov %rsp,%rbp
0x000000000000064e <+4>: 89 7d fc mov %edi,-0x4(%rbp)
4 i = i + 2;
0x0000000000000651 <+7>: 83 45 fc 02 addl $0x2,-0x4(%rbp)
5 i = i * 2;
0x0000000000000655 <+11>: d1 65 fc shll -0x4(%rbp)
6 return i;
0x0000000000000658 <+14>: 8b 45 fc mov -0x4(%rbp),%eax
7 }
0x000000000000065b <+17>: 5d pop %rbp
0x000000000000065c <+18>: c3 retq
End of assembler dump.
Итак, 0x0000000000000655 в myfunc
, давайте подтвердим, что он работает:
gdb -batch -ex 'file a.out' -ex 'disassemble/rs 0x0000000000000655'
Вывод: такой же, как и при предыдущей разборке.
Смотрите также: Как разобрать одну функцию с помощью objdump?
Протестировано на Ubuntu 18.04, GDB 8.1.