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 + обхідні шляхи
Роздрукуйте абзац, як згадано за посиланням: /unix/82944/how-to-grep-for-text-in-a-file-and-display-the-paragraph-that-has-the -текст
objdump -d main.out | awk -v RS= '/^[[:xdigit:]]+ <FUNCTION>/'
наприклад:
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'
адаптовано з: Як вибрати рядки між двома шаблонами маркерів, які можуть виникати кілька разів за допомогою 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 охоплює цей варіант використання.
static
, компілятор може вбудувати її на сайти викликів. Це може означати , що не може бути на Насправді будь-яка функція демонтує, самі по собі . Якщо ви можете помітити символи для інших функцій, але не функції, яку ви шукаєте, це сильний натяк на те, що функція була вбудована. Valgrind все ще може посилатися на оригінальну попередньо вбудовану функцію, оскільки інформація про налагодження файлу ELF зберігає, звідки походить кожна окрема інструкція, навіть якщо інструкції переміщені в інше місце.