Wyodrębnij zmienne globalne z pliku a.out

Edytuj (zaktualizowane pytanie)

Mam prosty program w C:

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

(program nie robi nic pożytecznego ...Moim celem jest wyodrębnienie nazw zmiennych, ich lokalizacji, w których są deklarowane, oraz adresu pamięci)

Kiedy kompiluję program, otrzymuję plika.out który jest plikiem elfa zawierającym informacje debugowania.

Ktoś w firmie napisał program w .net 5 lat temu, który otrzyma wszystkie te informacje z pliku a.out. Oto, co zwraca kod:

   //  Name          Display Name                    Type      Size     Address

Dla tego małego programu działa świetnie, a także dla innych dużych projektów.

Ten kod ma 2000 linii i zawiera kilka błędów i nie obsługuje wersji 4. NET. Dlatego staram się go odtworzyć.

Więc moje pytanie jest, Jestem zagubiony w tym sensie, że nie wiem, jakie podejście podjąć, aby rozwiązać ten problem. Oto opcje, które rozważałem:

Zorganizuj błędny kod programu, który pokazałem na pierwszym obrazie, i spróbuj zobaczyć, co robi i jak analizuje plik a.out, aby uzyskać te informacje. Kiedy już to zrozumiem, spróbuj dowiedzieć się, dlaczego nie obsługuje wersji 3 i 4.

Jestem w porządku w tworzeniu wyrażeń regularnych, więc może spróbuj poszukać wzorca w pliku a.out, wykonując coś w stylu: Do tej pory udało mi się znaleźć wzór, w którym jest tylko jeden plik (main.c). Ale gdy jest kilka plików, staje się bardziej skomplikowany. Jeszcze tego nie wypróbowałem. Może nie będzie to takie skomplikowane i będzie można znaleźć wzór.

zainstalowaćCygwin dzięki czemu mogę używać poleceń Linuksa w takich oknach jakobjdump, nm lubelfread. Nie korzystałem wystarczająco z poleceń, gdy używam takich poleceń, jakreadelf -w a.out Dostaję więcej informacji, których potrzebuję. Jest kilka powodów, dla których nie spędziłem tak dużo czasu z tym podejściem:

Wady: zainstalowanie cygwin w systemie Windows zajmuje trochę czasu, a podczas przekazywania tej aplikacji naszym klientom nie chcemy, aby musieli ją instalować. Może istnieje sposób na zainstalowanie komend objdump i elfread bez konieczności instalowania całej rzeczy

Plusy: Jeśli znajdziemy odpowiednie polecenie do użycia, nie wymyślimy na nowo koła i zaoszczędzimy trochę czasu. Może jest to kwestia analizowania wyników polecenia, takiego jakobjdump -w a.out

W przypadku, gdy chcesz pobrać plik a.out, aby go przeanalizowaćoto jest.

streszczenie

Będę mógł uzyskać zmienne globalne w pliku a.out. Chciałbym wiedzieć, jaki jest typ każdej zmiennej (int, char, ..), jaki adres pamięci mają, a także chcę wiedzieć, jaki plik jest deklarowany przez zmienną (main.c lub someOtherFile.c). Będę wdzięczny, jeśli nie będę musiał używać cygwin, ponieważ ułatwi to wdrażanie. Ponieważ pytanie to wymaga dużo, próbowałem podzielić go na więcej:

objdump / readelf pobierz informacje o zmiennychUzyskaj lokalizację symboli w pliku a.out

może powinienem usunąć inne pytania. przepraszam za zbędne.

questionAnswers(1)

yourAnswerToTheQuestion