У меня есть простая программа на 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
Для этой маленькой программы это прекрасно работает, а также для других больших проектов.
Этот код состоит из 2000 строк с несколькими ошибками и не поддерживает .NET версии 4. Вот почему я пытаюсь воссоздать его.
Итак, мой вопрос , я запутался в том смысле, что не знаю, какой подход выбрать для решения этой проблемы. Вот варианты, которые я рассматривал:
Организуйте ошибочный код программы, показанной на первом изображении, и попытайтесь увидеть, что она делает и как анализирует файл a.out, чтобы получить эту информацию. Как только я полностью разберусь с ним, постараюсь выяснить, почему он не поддерживает версии 3 и 4.
Я умею создавать регулярные выражения, так что, возможно, попробуйте найти шаблон в файле a.out, выполнив что-то вроде: Пока мне удалось найти шаблон, в котором есть только один файл (main.c). Но когда файлов несколько, все становится сложнее. Я еще не пробовал. Может быть, это будет не так сложно и удастся найти закономерность.
Установите 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, так как это облегчит развертывание. Поскольку этот вопрос требует многого, я попытался разбить его на несколько частей:
возможно, мне следует удалить другие вопросы . извините, что лишнее.