Extrahieren Sie globale Variablen aus einer .out-Datei

Bearbeiten (aktualisierte Frage)

Ich habe ein einfaches C-Programm:

   // it is not important to know what the code does you may skip the code 

Haupt c

#include <bsp.h>

unsigned int   AppCtr;
unsigned char  AppFlag;
int SOME_LARGE_VARIABLE;

static  void  AppTest (void);

void  main (void)
{
    AppCtr  = 0;
    AppFlag = 0;        
    AppTest();
}

static void Foo(void){
    SOME_LARGE_VARIABLE=15; 
}


static  void  AppTest (void)
{
    unsigned int  i;
    i = 0;
    while (i < 200000) {
        i++;
    }

    BSP_Test();      
    SOME_LARGE_VARIABLE=3;    
    Foo();
}

bsp.c

extern int SOME_LARGE_VARIABLE;
extern unsigned char  AppFlag;

unsigned int long My_GREAT_COUNTER;

void  BSP_Test (void) {
  SOME_LARGE_VARIABLE = 5;
  My_GREAT_COUNTER = 4;
}

(Das Programm macht nichts nützliches ...Mein Ziel ist es, die Variablennamen nach ihrer Position, an der sie deklariert werden, und nach ihrer Speicheradresse zu extrahieren)

Wenn ich das Programm kompiliere, erhalte ich die Dateia.out Dies ist eine Elf-Datei, die Debug-Informationen enthält.

Jemand in der Firma hat vor 5 Jahren ein Programm in .net geschrieben, das all diese Informationen aus der a.out-Datei abruft. Dies ist, was der Code zurückgibt:

   //  Name          Display Name                    Type      Size     Address

Für dieses kleine Programm funktioniert es großartig und auch für andere große Projekte.

Dieser Code ist 2000 Zeilen lang und enthält mehrere Fehler. .NET Version 4 wird nicht unterstützt. Aus diesem Grund versuche ich, ihn neu zu erstellen.

Also meine Frage istIch bin in dem Sinne verloren, dass ich nicht weiß, wie ich dieses Problem lösen soll. Dies sind die Optionen, über die ich nachgedacht habe:

Organisieren Sie den Fehlercode des Programms, das ich auf dem ersten Bild gezeigt habe, und versuchen Sie zu sehen, was es tut und wie es die a.out-Datei analysiert, um diese Informationen zu erhalten. Sobald ich es vollständig verstanden habe, versuche ich herauszufinden, warum es Version 3 und 4 nicht unterstützt.

Ich bin in der Lage, reguläre Ausdrücke zu erstellen. Versuchen Sie also, das Muster in der a.out-Datei zu suchen, indem Sie Folgendes tun: Bisher konnte ich das Muster dort finden, wo es nur eine Datei gibt (main.c). Aber wenn es mehrere Dateien gibt, wird es komplizierter. Ich habe es noch nicht ausprobiert. Vielleicht wird es nicht so kompliziert und es wird möglich sein, das Muster zu finden.

InstallierenCygwin damit ich linux befehle unter windows wieobjdump, nm oderelfread. Ich habe nicht genug mit den Befehlen gespielt, wenn ich solche Befehle verwende wiereadelf -w a.out Ich bekomme viel mehr Informationen, die ich brauche. Es gibt einige Nachteile, warum ich nicht so viel Zeit mit diesem Ansatz verbracht habe:

Nachteile: Die Installation von cygwin unter Windows dauert eine Weile. Wenn wir diese Anwendung unseren Kunden geben, möchten wir, dass sie sie nicht installieren müssen. Vielleicht gibt es eine Möglichkeit, einfach die Befehle objdump und elfread zu installieren, ohne das Ganze installieren zu müssen

Vorteile: Wenn wir den richtigen Befehl finden, werden wir das Rad nicht neu erfinden und Zeit sparen. Vielleicht geht es darum, die Ergebnisse eines Befehls wieobjdump -w a.out

Falls Sie die a.out-Datei herunterladen möchten, um sie zu analysierenhier ist es.

Zusammenfassung

Ich werde in der Lage sein, die globalen Variablen in einer .out-Datei abzurufen. Ich möchte wissen, welcher Typ jede Variable ist (int, char, ..), welche Speicheradresse sie haben und ich möchte auch wissen, in welcher Datei die Variable deklariert wird (main.c oder someOtherFile.c). Ich würde es begrüßen, wenn ich Cygwin nicht verwenden müsste, da es dadurch einfacher zu implementieren ist. Da diese Frage sehr viel verlangt, habe ich versucht, sie in mehrere Teile aufzuteilen:

objdump / readelf ruft Variableninformationen abAbrufen der Position von Symbolen in einer .out-Datei

vielleicht sollte ich die anderen fragen streichen. Entschuldigung, dass ich überflüssig bin.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage