Extrair variáveis globais do arquivo a.out
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á.
ResumoEu 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.outtalvez eu deva excluir as outras perguntas. desculpe ser redundante.