Wie kann ich feststellen, ob eine Binärdatei mit Frame-Zeigern kompiliert ist oder nicht unter Linux?

8

Ich habe eine Binär / Bibliothek in Linux. Wie kann ich feststellen, ob es mit Rahmenzeigern kompiliert wurde?

    
blackwing 23.03.2011, 02:08
quelle

1 Antwort

9

Zan / Blackwing:

Einige einfache Dinge mit / ohne framepointer-Optimierung zu kompilieren und diff -u auf der disassemblierten Ausgabe zu verwenden, gibt einige Hinweise:

%Vor%

Sie sehen mehrere Arten von Änderungen:

  1. Code mit framepointers enthält immer die beide der beiden Anweisungen push %ebp und mov %esp, %ebp .
    Framepointer-less code may (nicht im gezeigten Fall, da das %ebp -Register für nichts verwendet wird) push %ebp , aber nicht co_de% eins, da der Framezeiger nicht initialisiert werden muss.
  2. Code mit framepointers greift auf Argumente im Stack relativ zum framepointer zu, wie im gezeigten Fall mov %esp, %ebp .
    Frame Pointer-less Code tut dies relativ zum stackpointer , mit einem zusätzlichen Versatz der Größe des Stackframes der Funktion, wie zum Beispiel mov 0x8(%ebp), %ecx .
    Dasselbe gilt möglicherweise für lokale Variablen im angezeigten Code, der mov 0x408(%esp), %ecx für den Code, der framepointer verwendet, und lea -0x404(%ebp), %ebx (könnte mov %esp, %ebx sein) für den Code ohne FramePointer.
  3. Es gibt wahrscheinlich einige Änderungen in der Registerzuweisung zwischen den beiden, besonders wenn der Code komplex genug wird, das lea 0x0(%esp), %ebx -Register für eine lokale Variable zu verwenden (das gezeigte Beispiel zeigt das nicht)

Compiler-Optimierungsebenen haben einen gewissen Einfluss darauf, wie der generierte Code tatsächlich aussieht, aber diese spezifischen Elemente ( %ebp und die Verwendung von mov %esp, %ebp - relative Adressierung für Argumente / lokale Variablen) sind nur wurde jemals in Code gefunden, der framepointers verwendet, und fehlt, wenn Sie mit %ebp kompiliert haben.

    
FrankH. 23.03.2011, 10:05
quelle

Tags und Links