Могу ли я дать objdump адрес и разобрать содержащую его функцию? - PullRequest
13 голосов
/ 22 июня 2011

Меня действительно раздражает необходимость разбирать большие массивы библиотечного кода просто для того, чтобы получить достаточно контекста, чтобы увидеть, что вызывает сбой. Есть ли способ, которым я могу просто передать objdump адрес, и он найдет для меня границы содержащей функции?

РЕДАКТИРОВАТЬ: еще лучше, могу ли я разобрать всю трассировку стека для меня?

Ответы [ 3 ]

16 голосов
/ 22 июня 2011

Возможно, что-то подобное?

$ objdump -S --start-address=0x42 foo.o | awk '{print $0} $3~/retq?/{exit}'

Распечатывает список разборки, начиная с 0x42, пока не найдет ret(q), предполагая, что граница помечена ret(q)

2 голосов

gdb disassemble

gdb -batch -ex "file $EXECUTABLE" -ex "disassemble/rs $ADDRESS"

Например:

ac:

#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.

2 голосов
/ 22 июня 2011

objdump --start-address= возможно?

...