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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top