Извлечь глобальные переменные из файла .out

Редактировать (обновленный вопрос)

У меня есть простая программа на C:

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

main.c

#include 

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

(программа не делает ничего полезного... ] Моя цель состоит в том, чтобы извлечь имена переменных, их местоположение, где они объявляются, и их адрес памяти )

Когда я компилирую программу, я получаю файл a.out, который является файлом elf. содержащие отладочную информацию.

Кто-то из компании написал программу на .net 5 лет назад, которая будет получать всю эту информацию из файла a.out.Вот что возвращает код:

   //  Name          Display Name                    Type      Size     Address

enter image description here

Для этой маленькой программы это прекрасно работает, а также для других больших проектов.

Этот код состоит из 2000 строк с несколькими ошибками и не поддерживает .NET версии 4. Вот почему я пытаюсь воссоздать его.


Итак, мой вопрос , я запутался в том смысле, что не знаю, какой подход выбрать для решения этой проблемы. Вот варианты, которые я рассматривал:

  1. Организуйте ошибочный код программы, показанной на первом изображении, и попытайтесь увидеть, что она делает и как анализирует файл a.out, чтобы получить эту информацию. Как только я полностью разберусь с ним, постараюсь выяснить, почему он не поддерживает версии 3 и 4.

  2. Я умею создавать регулярные выражения, так что, возможно, попробуйте найти шаблон в файле a.out, выполнив что-то вроде: enter image description hereПока мне удалось найти шаблон, в котором есть только один файл (main.c). Но когда файлов несколько, все становится сложнее. Я еще не пробовал. Может быть, это будет не так сложно и удастся найти закономерность.

  3. Установите Cygwin, чтобы я мог использовать команды Linux в окнах, такие как objdump, nmили elfread. Я недостаточно наигрался с командами, когда я использую такие команды, как readelf -w a.out, я получаю гораздо больше информации, которая мне нужна. Есть несколько минусов, из-за которых я не тратил так много времени на этот подход:

    • Минусы: установка cygwin в Windows занимает некоторое время, и, предоставляя это приложение нашим клиентам, мы не хотим, чтобы им приходилось его устанавливать.Может быть, есть способ просто установить команды objdump и elfread без необходимости установки всего этого

    • Плюсы: Если мы найдем правильную команду для использования, мы не будем изобретать велосипед и сэкономим время. Возможно, это вопрос анализа результатов такой команды, как objdump -wa a.out


Если вы хотите загрузить файл a.out для его анализа вот он].


Резюме

Я буду иметь возможность получить глобальные переменные в файле .out. Я хотел бы знать, какого типа каждая переменная (int, char, ..), какой у них адрес памяти, и мне также хотелось бы знать, в каком файле объявляется переменная (main.c или someOtherFile.c). Я буду признателен, если мне не придется использовать cygwin, так как это облегчит развертывание. Поскольку этот вопрос требует многого, я попытался разбить его на несколько частей:

возможно, мне следует удалить другие вопросы . извините, что лишнее.

9
задан Community 23 May 2017 в 12:25
поделиться