LINUX.ORG.RU
Ответ на: комментарий от tailgunner

1:1 воссоздание структуры по ее тексту на С

XVilka ★★★★★
() автор топика
Ответ на: комментарий от XVilka

> 1:1 воссоздание структуры по ее тексту на С

Всё равно непонятно. Итак, на входе - массив байтов и некое описание (предположим, struct { ... }). А на выходе что? Красиво напечатанный текст?

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

задача - есть структура, к примеру:

struct {
   int x;
   int y;
   char z[256];
};
это в текстовом файле, читаем ее и строим в рантайме соотв. структуру и создаем соотв переменную. Чтобы например потом считать другой файл в эту переменную.

XVilka ★★★★★
() автор топика
Ответ на: комментарий от XVilka

Тогда либо компилятор, либо libdwarf. Хотя здесь важен только размер структуры, так что можно даже попробовать написать свой парсер.

tailgunner ★★★★★
()

конечно совершенно ничего не ясно из вопроса,

НО если надо вытащить ВСЮ метаинформацию о структуре и куда-то её скласть, то gdb api вам в помощь :)

На поверхностный взгляд просто - автоматически делается программа с единственной переменной нужного типа и функцией main. Собирается с ключом -g. Запускается под отладчиком..Далее допрос отладчика и складывание результатов в укромное место :)

MKuznetsov ★★★★★
()
Ответ на: комментарий от XVilka

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

К парсингу это имеет мало отношения.

baverman ★★★
()
Ответ на: комментарий от MKuznetsov

> На поверхностный взгляд просто - автоматически делается программа с единственной переменной нужного типа и функцией main. Собирается с ключом -g

...и обрабатывается libdwarf :)

tailgunner ★★★★★
()
Ответ на: комментарий от baverman

в смысле мало отношения? а как тогда распарсить текст структуры в файле?

XVilka ★★★★★
() автор топика
Ответ на: комментарий от XVilka

> не только размер. мне, можно сказать, нужны размеры всех элементов структуры.

То есть тебе нужно нечто большее, чем ты говоришь. Скажем, разобрать байтовый массив на поля, причем знать тип полей, имена, смещения - т.е. всё, что знает компилятор. Я, правда, не понимаю, что ты собираешься делать с этой информацией (кроме как красиво ее напечатать), но всё это можно выцепить из DWARF.

tailgunner ★★★★★
()
Ответ на: комментарий от XVilka

> да, наверное, самый простой вариант

тут есть два варианта - кодогенерация, т.е. вынести часть логики для обработки структуры в отдельный компилируемый код, либо «влезть» в данные самого tcc, который хранит у себя сведения о типах, опять же зависит от задачи

aho
()
Ответ на: комментарий от tailgunner

да это я пишу тулзу для реверс-инжиниринга, потому и задача соотв. чтобы что-то посмотреть можно было по-быстрому, не запуская ida pro.

XVilka ★★★★★
() автор топика
Ответ на: комментарий от XVilka

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

Может, тебя вообще устроят python + ctypes + python-ctypeslib

tailgunner ★★★★★
()
Ответ на: комментарий от XVilka

> Но надо на С

Тогда только libdwarf или libtcc (но этой я никогда не пользовался). В принципе, если допустимо гибридное решение, можно python-ctypeslib (или тем же cparser) генерировать простейший дескриптор (список полей структуры), и его уже загружать в программу на чистом Си.

tailgunner ★★★★★
()

Clang - парсит текст, строит AST. Написан на С++, но есть С интерфейс для прогулки по AST.

fopen ★★
()
Ответ на: комментарий от KblCb

утилита для реверс-инжиниринга. Для простых задач, чтобы ida pro не запускать по сто раз.

XVilka ★★★★★
() автор топика
Ответ на: комментарий от XVilka

> утилита для реверс-инжиниринга. Для простых задач, чтобы ida pro не запускать по сто раз.

Необходимо парсить C-структуры в программе на C.

Гугл не помог



\0

Ты уверен что тебе надо реверс инжинирить ? :) Мб С там подучить иль еще че ?

Jetty ★★★★★
()
Ответ на: комментарий от Eddy_Em

Нет. Не всегда. Никак вы не поймете - есть текст, например заголовочный файл. Из него надо считать структуры, распарсить, и создать точно такие же структуры в памяти (реальные C структуры), и, уже, ими манипулировать.

XVilka ★★★★★
() автор топика
Ответ на: комментарий от Jetty

Мимо. Реверс-инжиниринг не заключается тупо в дизассемблировании. С я знаю не в совершенстве, но достаточно хорошо.

XVilka ★★★★★
() автор топика
Ответ на: комментарий от Eddy_Em

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

XVilka ★★★★★
() автор топика
Ответ на: комментарий от beastie

Спасибо, еще один дельный совет. Возьму на заметку.

XVilka ★★★★★
() автор топика
Ответ на: комментарий от tailgunner

А я чуть по другому вопрос поставлю. Есть некоторая структура, ее дампят на диск (ее или массив структур). Есть возможность снабдить дамп заголовком. Нужно слить в заголовок некоторое описание структуры (типов и сдвигов полей), что бы потом при чтении из другой программы можно было выдернуть отдельные поля (по названиям) структуры и сунуть их в другую структуру. Объемы данных большие, чтение делается на С++ и должно работать по возможности быстро. Как это можно сделать проще всего?

Нужно при сохранении данных расчета на диск и последующей обработке. Обработка стандартная, а формат сохранения может менятся очень часто. Т.е. что бы единожды написанная обработка автоматом понимала все форматы.

AIv ★★★★★
()
Ответ на: комментарий от AIv

> Как это можно сделать проще всего?

как вариант - sqlite + виртуальные таблицы поверх векторов структур, тогда перенос данных будет через создание запроса

aho
()
Ответ на: комментарий от AIv

> Есть некоторая структура, ее дампят на диск (ее или массив структур). Есть возможность снабдить дамп заголовком. Нужно слить в заголовок некоторое описание структуры (типов и сдвигов полей)

Т.е. какие-то примитивные метаданные («словарь данных», ЕВПОЧЯ %)).

Т.е. что бы единожды написанная обработка автоматом понимала все форматы.

Ну, например: удалили поле, добавили поле. Что делает обработка?

tailgunner ★★★★★
()
Ответ на: комментарий от aho

> как вариант - sqlite + виртуальные таблицы поверх векторов структур

По-моему, HDF5 предназначался как раз для подобных задач. Интерфейсы на Си++ и Питоне прилагаются.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Т.е. какие-то примитивные метаданные («словарь данных», ЕВПОЧЯ %)).

Да, что то такое, на основе чего можно разобраться в структуре и что можно легко сгенерить автоматом.

Ну, например: удалили поле, добавили поле. Что делает обработка?

Скажем у меня есть в одном файле массив структур

struct A{
 double x, y, z; int ID;
};

а в другом

struct A{
 short ID; float x, y; 
};

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

struct A{
 float y; short ID;  
};

И она должна уметь это делать для любого файла со структурами, в к-х есть поля «у» и «ID», причем делать быстро (размер данных гигабайты и более).

AIv ★★★★★
()
Ответ на: комментарий от AIv

Ну то есть в файле хранить список полей файла, в программе - список полей, нужных для обработки, и уметь задавать программе отображение из одного в другое (с дефолтовым отображением по совпадающим имени и типу). Никаких принципиальных проблем (при отсуствии вложенных структур - вообще никаких проблем), но готовой библиотеки для этого я не знаю.

размер данных гигабайты

По-моему, вы изобретате HDF5

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Изощренное упорядочение этих структур в массиве. Вектором эмулируется многомерный массив, но смещение считается не как обычно а локально-рекурсивно. В принципе конечно в HDF5 это всунуть можно, но не очень понятно пока зачем.

AIv ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.