Extraer variables globales de un archivo .out

Editar (pregunta actualizada)

Tengo un programa simple en C:

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

C Principal

#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;
}

(El programa no hace nada útil ...Mi objetivo es extraer los nombres de las variables, su ubicación donde se están declarando y su dirección de memoria.)

Cuando compilo el programa obtengo el archivoa.out que es un archivo elf que contiene información de depuración.

Alguien de la compañía escribió un programa en .net hace 5 años que obtendrá toda esta información del archivo a.out. Esto es lo que devuelve el código:

   //  Name          Display Name                    Type      Size     Address

Para este pequeño programa funciona muy bien y también para otros grandes proyectos.

Ese código tiene 2000 líneas con varios errores y no es compatible con .NET versión 4. Por eso estoy tratando de recrearlo.

Así que mi pregunta esEstoy perdido en el sentido de que no sé qué enfoque tomar para resolver este problema. Estas son las opciones que he estado considerando:

Organice el código de error del programa que mostré en la primera imagen e intente ver qué hace y cómo analiza el archivo a.out para obtener esa información. Una vez que lo entiendo completamente, trato de averiguar por qué no es compatible con las versiones 3 y 4.

Estoy bien para crear expresiones de expresiones regulares, así que tal vez intente buscar el patrón en el archivo a.out haciendo algo como: Hasta ahora he podido encontrar el patrón donde solo hay un archivo (main.c). Pero cuando hay varios archivos se vuelve más complicado. No lo he probado todavía. Quizás no sea tan complicado y sea posible encontrar el patrón.

InstalarCygwin para que pueda usar los comandos de Linux en ventanas comoobjdump, nm oelfread. No he jugado lo suficiente con los comandos cuando uso esos comandos comoreadelf -w a.out Recibo mucho más información que necesito. Hay algunas desventajas por las que no he pasado tanto tiempo con este enfoque:

Contras: se tarda un poco en instalar cygwin en Windows y, al proporcionar esta aplicación a nuestros clientes, no queremos que tengan que instalarla. Tal vez haya una manera de simplemente instalar los comandos objdump y elfread sin tener que instalar todo.

Pros: Si encontramos el comando correcto para usar, no reinventaremos la rueda y ahorraremos tiempo. Tal vez es una cuestión de analizar los resultados de un comando comoobjdump -w a.out

En caso de que quieras descargar el archivo a.out para analizarloaquí está.

Resumen

Debo poder obtener las variables globales en un archivo .out. Me gustaría saber qué tipo es cada variable (int, char, ..), qué dirección de memoria tienen y también me gustaría saber en qué archivo se está declarando la variable (main.c o someOtherFile.c). Apreciaré si no tengo que usar cygwin ya que eso hará que sea más fácil de implementar. Como esta pregunta pide mucho, intenté dividirla en más:

objdump / readelf obtener información de variablesObtener ubicación de los símbolos en un archivo de salida.

Tal vez debería eliminar las otras preguntas. lo siento ser redundante

Respuestas a la pregunta(1)

Su respuesta a la pregunta