gdb disassemble/rs
, um auch Quell- und Rohbytes anzuzeigen
Mit diesem Format kommt es der objdump -S
Ausgabe sehr nahe :
gdb -batch -ex "disassemble/rs $FUNCTION" "$EXECUTABLE"
Haupt 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;
}
Kompilieren und zerlegen
gcc -O0 -ggdb3 -std=c99 -Wall -Wextra -pedantic -o main.out main.c
gdb -batch -ex "disassemble/rs myfunc" main.out
Demontage:
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.
Getestet unter Ubuntu 16.04, GDB 7.11.1.
objdump + awk Workarounds
Drucken Sie den Absatz wie folgt aus: /unix/82944/how-to-grep-for-text-in-a-file-and-display-the-paragraph-that-has-the -Text
objdump -d main.out | awk -v RS= '/^[[:xdigit:]]+ <FUNCTION>/'
z.B:
objdump -d main.out | awk -v RS= '/^[[:xdigit:]]+ <myfunc>/'
gibt nur:
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
Bei der Verwendung -S
gibt es meines Erachtens keinen ausfallsicheren Weg, da die Codekommentare eine mögliche Reihenfolge enthalten könnten ... Aber das Folgende funktioniert fast immer:
objdump -S main.out | awk '/^[[:xdigit:]]+ <FUNCTION>:$/{flag=1;next}/^[[:xdigit:]]+ <.*>:$/{flag=0}flag'
angepasst von: So wählen Sie Linien zwischen zwei Markierungsmustern aus, die bei awk / sed mehrfach auftreten können
Antworten auf die Mailingliste
Auf der Mailingliste befindet sich ein Thread von 2010, der besagt, dass dies nicht möglich ist: https://sourceware.org/ml/binutils/2010-04/msg00445.html
Neben der gdb
von Tom vorgeschlagenen Problemumgehung kommentieren sie auch eine andere (schlechtere) Problemumgehung beim Kompilieren, mit -ffunction-section
der eine Funktion pro Abschnitt erstellt und dann der Abschnitt ausgegeben wird.
Nicolas Clifton gab ihm ein WONTFIX https://sourceware.org/ml/binutils/2015-07/msg00004.html , wahrscheinlich weil die GDB- Problemumgehung diesen Anwendungsfall abdeckt.
static
, wird sie möglicherweise vom Compiler in ihre Aufrufseiten eingefügt. Dies kann bedeuten , dass es nicht wirklich jede Funktion zu zerlegen sein kann, per se . Wenn Sie Symbole für andere Funktionen erkennen können, jedoch nicht für die gesuchte Funktion, ist dies ein starker Hinweis darauf, dass die Funktion eingebunden wurde. Valgrind verweist möglicherweise weiterhin auf die ursprüngliche vorinline-Funktion, da in den Debugging-Informationen der ELF-Datei gespeichert wird, woher jeder einzelne Befehl stammt, selbst wenn die Befehle an einen anderen Ort verschoben werden.