Генерация таблицы символов полного контекста из файла ELF - PullRequest
0 голосов
/ 27 декабря 2018

Я пытаюсь найти хитрый способ генерации таблицы символов из моего скомпилированного двоичного файла.

Обычно я работаю со встроенным полнофункциональным набором инструментов GNU, хотя я открыт для использованиясистемные утилиты (желательно Windows / MSYS2 / Cygwin), чтобы помочь.Мой язык сценариев - Python, так как этот язык обычно используется в компании, для которой я работаю.

Для справки, следующий пост ~ 4 года назад - почти то, что я ищу, и янадеялся, что с учетом того, что прошло значительное количество времени, должен быть более простой способ добиться этого.

Извлечение подробной символьной информации (членов структуры) из файла elf, скомпилированного с ARM-GCC

Я хорошо знаком с GDB и привык использовать info variables, p &name, ptype name и т. Д. В конечном итоге мне нужен ввод / вывод, который выглядит примерно так, как показано ниже.Мне нужно будет поддерживать все структуры, союзы, перечисления и глубокое вложение типов (структуры внутри структур внутри структур).Я в порядке, удаляя все другие декорации, такие как статические, изменчивые, атомарные и т. Д. Я пока не уверен, что я хочу сделать с указателями, но я полагаю, было бы неплохо добавить звездочку к типу вВывод CSV ниже.

Пример кода

uint64_t myU64;
int64_t my64;

typedef struct {
    uint8_t aaa;
    int8_t bbb;
} myStruct2_t;

struct {
    uint32_t a;
    int32_t b;
    float c;
    enum {
        E_ONE = 100,
        E_TWO = 200,
        E_THREE = 300
    } myEnum;
    union {
        uint16_t aa;
        int16_t bb;
    } myUnion;
    myStruct2_t myStruct2[3];
    uint32_t myArr[2];
} myStruct;

Требуемый вывод

myU64, 0x8001918, uint64_t
my64, 0x800191C, int64_t
myStruct.a, 0x8001920, uint32_t
myStruct.b, 0x8001924, int32_t
myStruct.c, 0x8001928, float
myStruct.myEnum, 0x800192C, int16_t <-- Requires deeper digging for enum
myStruct.myUnion.aa, 0x800192E, uint16_t
myStruct.myUnion.bb, 0x800192E, int16_t
myStruct.myStruct2[0].aaa, 0x8001930, uint8_t
myStruct.myStruct2[0].bbb, 0x8001931, int8_t
myStruct.myStruct2[1].aaa, 0x8001932, uint8_t
myStruct.myStruct2[1].bbb, 0x8001933, int8_t
myStruct.myStruct2[2].aaa, 0x8001934, uint8_t
myStruct.myStruct2[2].bbb, 0x8001935, int8_t
myStruct.myArr[0], 0x8001938, uint32_t
myStruct.myArr[1], 0x800193C, uint32_t

Используя приведенные выше примеры команд gdb, я могу получить всю эту информацию, но этопотребовал бы, чтобы я написал чрезвычайно сложный синтаксический анализатор строк.Есть идеи?Существующие инструменты или простой способ автоматизировать это?У меня все в порядке с созданием инструмента, но пока мои идеи требуют чудовищного разбора строк.Я кратко рассмотрел API Python / GDB, но не видел примеров, которые очень применимы, но, возможно, я тоже мог бы воспользоваться этим путем.

Кроме того, хотя я сосредоточился на использовании gdbЯ открыт для любого другого инструмента, который может помочь.

Спасибо!

1 Ответ

0 голосов
/ 28 декабря 2018

удобный способ создания таблицы символов из моего скомпилированного двоичного файла.

Ваш скомпилированный двоичный файл уже имеет таблицу символов, и то, что вы пытаетесь сгенерировать, не имеет ничего общего с тем, чтообычно это таблица символов, что создает ненужную путаницу.

Что вам нужно, так это описание отладочной информации в нестандартном формате (стандартный формат - DWARF, который GDB считывает для вывода из ptype).).

Для программного считывания отладочной информации DWARF используйте libdwarf .

...