Extrair variáveis ​​globais do arquivo a.out

Editar (pergunta atualizada)

Eu tenho um programa C simples:

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

main.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;
}

(o programa não faz nada de útil ...Meu objetivo é extrair os nomes das variáveis ​​de sua localização onde eles estão sendo declarados e seu endereço de memória)

Quando eu compilo o programa eu recebo o arquivoa.out que é um arquivo elf contendo informações de depuração.

Alguém da empresa escreveu um programa em .net há 5 anos que obterá todas essas informações do arquivo a.out. Isto é o que o código retorna:

   //  Name          Display Name                    Type      Size     Address

Para este pequeno programa, ele funciona muito bem e também para outros grandes projetos.

Esse código tem 2000 linhas com vários bugs e não suporta o .NET versão 4. É por isso que estou tentando recriá-lo.

Então minha pergunta é, Estou perdido no sentido de que não sei qual abordagem tomar para resolver este problema. Estas são as opções que estive considerando:

Organize o código de buggy do programa que mostrei na primeira imagem e tente ver o que ele faz e como ele analisa o arquivo a.out para obter essa informação. Uma vez que eu entendi completamente, tente descobrir por que ele não suporta as versões 3 e 4.

Eu estou bem em criar expressões regex então talvez tente procurar o padrão no arquivo a.out fazendo algo como: Até agora consegui encontrar o padrão onde há apenas um arquivo (main.c). Mas quando há vários arquivos, é mais complicado. Eu não tentei ainda. Talvez não seja tão complicado e será possível encontrar o padrão.

InstalarCygwin para que eu possa usar comandos do linux em janelas comoobjdump, nm ouelfread. Eu não tenho jogado o suficiente com os comandos quando eu uso esses comandos comoreadelf -w a.out Eu tenho muito mais informação que eu preciso. Há alguns contras porque eu não gasto muito tempo com essa abordagem:

Contras: Demora um tempo para instalar o cygwin no Windows e ao fornecer este aplicativo para nossos clientes, não queremos que eles tenham que instalá-lo. Talvez haja uma maneira de apenas instalar os comandos objdump e elfread sem ter que instalar a coisa toda

Prós: Se encontrarmos o comando certo para usar, não iremos reinventar a roda e poupar algum tempo. Talvez seja uma questão de analisar os resultados de um comando comoobjdump -w a.out

Caso você queira baixar o arquivo a.out para analisá-loAqui está.

Resumo

Eu serei capaz de obter as variáveis ​​globais em um arquivo .out. Eu gostaria de saber que tipo de variável é (int, char, ..), qual endereço de memória eles possuem e também gostaria de saber em qual arquivo a variável está sendo declarada (main.c ou someOtherFile.c). Eu apreciarei se não precisar usar o cygwin, pois isso facilitará a implementação. Como essa pergunta pede muito, tentei dividi-la em mais:

objdump / readelf obtém informações sobre variáveisObter a localização dos símbolos no arquivo a.out

talvez eu deva excluir as outras perguntas. desculpe ser redundante.

questionAnswers(1)

yourAnswerToTheQuestion