Die Suche nach Orten in Maschinencode (gcc / objdump -d)
-
08-07-2019 - |
Frage
Wenn Sie eine bestimmte Linie von C-Code im Auge in der Maschinenleistung zu prüfen haben, wie würden Sie es in objdump Ausgang finden. Hier ist ein Beispiel
if (cond)
foo;
bar();
und ich möchte sehen, ob bar inlined wurde als Ich mag würde. Oder möchten Sie einige alternative Werkzeug statt objdump verwenden?
Lösung
Sie können objdump mit der -S
Option starten (wie "objdump -Sd a.out"
). Es wird der Quelltext angezeigt werden mit dem Assembler-Code intermixxed, wenn die Quelle-Dateien der Code kompiliert wurde aus verfügbar sind.
Alternativ können Sie die folgende Art und Weise verwendet werden:
int main(void) {
int a = 0;
asm("#");
return a;
}
wird
.file "a.c"
.text
.globl main
.type main, @function
main:
leal 4(%esp), %ecx
andl $-16, %esp
pushl -4(%ecx)
pushl %ebp
movl %esp, %ebp
pushl %ecx
subl $16, %esp
movl $0, -8(%ebp)
#APP
# 3 "a.c" 1
#
# 0 "" 2
#NO_APP
movl -8(%ebp), %eax
addl $16, %esp
popl %ecx
popl %ebp
leal -4(%ecx), %esp
ret
.size main, .-main
.ident "GCC: (GNU) 4.3.2"
.section .note.GNU-stack,"",@progbits
Andere Tipps
Sie Debugger sollten auch Sie Quellcode und passende Montage sehen, wenn Sie mit Debug-Symbolen kompiliert. Dies ist gcc Option -g und GDB disass Befehl.
Wenn Sie mit gcc sind kompilieren, können Sie -S verwenden, um eine Baugruppendatei direkt zu erzeugen. Diese Datei hat in der Regel einige nützliche Informationen darin, einschließlich Funktionsnamen und manchmal Zeilennummern für Code (abhängig von den Kompilierungsoptionen Sie verwenden).
Funktionsaufrufe in der Anordnung durch die gemeinsame Funktion prolog erkannt werden.
Mit i386 ist
55 push %ebp
89 e5 mov %esp, %ebp
...
c9 leave # optional
c3 ret
mit AMD64 / x86_64 ist ähnlich (nur der Quad-Präfix 48
):
55 push %rbp
48 89 e5 mov %rsp,%rbp
..
c9 leaveq # optional
c3 retq
Also, wenn Sie feststellen, dass in Ihrem objdump -S bla.o
oder
gcc bla.c -g -fsave-temps -fverbose-asm
Ausgang Ihrer Hauptfunktion
und Bar auch bar nicht inlined. Auch wenn die Haupt hat einen Anruf oder springen
versperren es nicht inlined wird.
In Ihrem Fall könnte man sehen, ob bar vor Ort Vars hat, das Zimmer muss auf
der lokale Stapel. Wenn bar inlined wird der Stapel einzustellen (z.B. sub $0x8,%esp
)
direkt nach dem Haupt Prolog getan wird, könnte Haupt dass var zugreifen.
Wenn es nicht ist privat bar.