gdb disassemble/rs
для отображения исходных и необработанных байтов
С этим форматом он очень близок к выводу objdump -S
:
gdb -batch -ex "disassemble/rs $FUNCTION" "$EXECUTABLE"
main.c
#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;
}
Компилировать и дизассемблировать
gcc -O0 -ggdb3 -std=c99 -Wall -Wextra -pedantic -o main.out main.c
gdb -batch -ex "disassemble/rs myfunc" main.out
Разборка:
Dump of assembler code for function myfunc:
main.c:
3 int myfunc(int i) {
0x0000000000001135 <+0>: 55 push %rbp
0x0000000000001136 <+1>: 48 89 e5 mov %rsp,%rbp
0x0000000000001139 <+4>: 89 7d fc mov %edi,-0x4(%rbp)
4 i = i + 2;
0x000000000000113c <+7>: 83 45 fc 02 addl $0x2,-0x4(%rbp)
5 i = i * 2;
0x0000000000001140 <+11>: d1 65 fc shll -0x4(%rbp)
6 return i;
0x0000000000001143 <+14>: 8b 45 fc mov -0x4(%rbp),%eax
7 }
0x0000000000001146 <+17>: 5d pop %rbp
0x0000000000001147 <+18>: c3 retq
End of assembler dump.
Протестировано на Ubuntu 16.04, GDB 7.11.1.
обходные пути objdump + awk
Распечатайте абзац, как указано по адресу: https://unix.stackexchange.com/questions/82944/how-to-grep-for-text-in-a-file-and-display-the-paragraph-что-имеет-текст
objdump -d main.out | awk -v RS= '/^[[:xdigit:]]+ <FUNCTION>/'
e.g.:
objdump -d main.out | awk -v RS= '/^[[:xdigit:]]+ <myfunc>/'
дает только:
0000000000001135 <myfunc>:
1135: 55 push %rbp
1136: 48 89 e5 mov %rsp,%rbp
1139: 89 7d fc mov %edi,-0x4(%rbp)
113c: 83 45 fc 02 addl $0x2,-0x4(%rbp)
1140: d1 65 fc shll -0x4(%rbp)
1143: 8b 45 fc mov -0x4(%rbp),%eax
1146: 5d pop %rbp
1147: c3 retq
При использовании -S
я не думаю, что существует безотказный способ, так как комментарии к коду могут содержать любую возможную последовательность... Но следующее работает почти всегда:
objdump -S main.out | awk '/^[[:xdigit:]]+ <FUNCTION>:$/{flag=1;next}/^[[:xdigit:]]+ <.*>:$/{flag=0}flag'
адаптировано из: How для выбора строк между двумя шаблонами маркеров, которые могут встречаться несколько раз с помощью awk/sed
Ответы на список рассылки
В списке рассылки есть тема 2010 года, в которой говорится, что это невозможно: https://sourceware.org/ml/binutils/2010-04/msg00445.html
Помимо обходного пути gdb
, предложенного Томом, они также комментируют другой (худший) обходной путь компиляции с -ffunction-section
, который помещает одну функцию в раздел, а затем выгружает раздел.
Николас Клифтон дал ему WONTFIX https://sourceware.org/ml/binutils/2015-07/msg00004.html , вероятно, потому, что обходной путь GDB охватывает этот вариант использования.
person
Ciro Santilli 新疆再教育营六四事件ۍ
schedule
30.06.2015
static
, она может быть встроена компилятором в свои сайты вызова. Это может означать, что на самом деле не может быть никакой функции для дизассемблирования per se. Если вы можете найти символы для других функций, но не для функции, которую вы ищете, это сильный намек на то, что функция была встроена. Valgrind может по-прежнему ссылаться на исходную предварительно встроенную функцию, поскольку в отладочной информации файла ELF хранится информация о том, откуда была взята каждая отдельная инструкция, даже если инструкции перемещены в другое место. - person davidg   schedule 01.04.2014addr2line
примет ПК/IP-адреса отstdin
и распечатает соответствующие строки исходного кода. Точно так жеobjdump -l
будет смешивать objdump со строками исходного кода; хотя для высокооптимизированного кода с тяжелым встраиванием результаты любой программы не всегда особенно полезны. - person davidg   schedule 01.04.2014