gdb, disassemble/rs
aby wyświetlić również bajty źródłowe i surowe
W tym formacie bardzo zbliża się do objdump -S
wyniku:
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;
}
Skompiluj i zdemontuj
gcc -O0 -ggdb3 -std=c99 -Wall -Wextra -pedantic -o main.out main.c
gdb -batch -ex "disassemble/rs myfunc" main.out
Demontaż:
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.
Testowano na Ubuntu 16.04, GDB 7.11.1.
objdump + awk obejścia
Wydrukuj akapit, jak wspomniano na: /unix/82944/how-to-grep-for-text-in-a-file-and-display-the-paragraph-that-has-the -tekst
objdump -d main.out | awk -v RS= '/^[[:xdigit:]]+ <FUNCTION>/'
na przykład:
objdump -d main.out | awk -v RS= '/^[[:xdigit:]]+ <myfunc>/'
daje tylko:
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
Podczas używania -S
nie wydaje mi się, aby istniał sposób odporny na awarie, ponieważ komentarze do kodu mogą zawierać dowolną możliwą sekwencję ... Ale poniższe działa prawie cały czas:
objdump -S main.out | awk '/^[[:xdigit:]]+ <FUNCTION>:$/{flag=1;next}/^[[:xdigit:]]+ <.*>:$/{flag=0}flag'
zaadaptowano z: Jak zaznaczyć linie między dwoma wzorami znaczników, które mogą wystąpić wielokrotnie w awk / sed
Odpowiedzi na listy mailingowe
Na liście mailingowej z 2010 roku jest wątek, który mówi, że to niemożliwe: https://sourceware.org/ml/binutils/2010-04/msg00445.html
Oprócz gdb
obejścia zaproponowanego przez Toma, komentują również inne (gorsze) obejście kompilacji, w -ffunction-section
którym jedna funkcja jest umieszczana na sekcję, a następnie zrzucana jest sekcja.
Nicolas Clifton dał mu WONTFIX https://sourceware.org/ml/binutils/2015-07/msg00004.html , prawdopodobnie dlatego, że obejście GDB obejmuje ten przypadek użycia.
static
, może zostać wstawiona przez kompilator do witryn wywołań. Może to oznaczać, że nie może w rzeczywistości być dowolna funkcja demontować, per se . Jeśli możesz znaleźć symbole innych funkcji, ale nie funkcji, której szukasz, jest to silna wskazówka, że funkcja została wbudowana. Valgrind może nadal odwoływać się do oryginalnej, wstępnie wstawionej funkcji, ponieważ informacje debugowania pliku ELF przechowują skąd pochodzi każda indywidualna instrukcja, nawet jeśli instrukcje są przenoszone w inne miejsce.