Например TDA7294

Форум РадиоКот :: Просмотр темы - Си (С++) и автоматический поиск зависимостей при компиляции.
Форум РадиоКот
https://radiokot.ru/forum/

Си (С++) и автоматический поиск зависимостей при компиляции.
https://radiokot.ru/forum/viewtopic.php?f=62&t=196646
Страница 1 из 1

Автор:  6797 [ Пн фев 03, 2025 14:51:38 ]
Заголовок сообщения:  Си (С++) и автоматический поиск зависимостей при компиляции.

Есть задача кое-что дешифровать.
Есть способ это сделать - готовое устройство где дешифровка работает.
Есть полные исходники прошивки этого устройства, поэтому захотелось извлечь код дешифровки из этих исходников.

Первое, что пришло в голову - проанализировать исходники и перенести код в свою программу.
Но исходники крайне запутанные - например, структура содержит в себе другие структуры и типы, которые в свою очередь ссылаются на другие структуры и типы, и всё это расползается на десятки уровней вложенности в нескольких сотнях файлов.

Пытался вручную искать нужные объявления структур, типов и макросов, но из-за дикой степени вложенности голова просто идёт кругом, и конца края этой вложенности не видно. Подозреваю, что сделано это специально с целью обфускации кода - исходники вроде и есть, но из них хрен достанешь нужный алгоритм.

Вот и возник вопрос - а нет ли какой системы сборки, которой указываешь директорию где лежат все чужие исходники, а она анализирует твой собственный код и, встретив там неизвестную ещё зависимость, сама ищет в указанной директории и всех поддиректориях нужные .h заголовки?

Вот не верится, что ничего подобного никто не делал, потому прошу подсказать правильное направление.

Автор:  jcxz [ Пн фев 03, 2025 19:45:40 ]
Заголовок сообщения:  Re: Си (С++) и автоматический поиск зависимостей при компиля

Вот и возник вопрос - а нет ли какой системы сборки, которой указываешь директорию где лежат все чужие исходники, а она анализирует твой собственный код и, встретив там неизвестную ещё зависимость, сама ищет в указанной директории и всех поддиректориях нужные .h заголовки?
Вы хотите собрать в единый файл всё, что подключается при помощи #include что-ль?
Так это просто - найдите и активируйте в своём компиляторе в свойствах проекта ключ, разрешающий сохранение результатов работы препроцессора в файлы.
В IAR-е это - галка "Preprocessor output to file" в разделе "Препроцессор". .i-файлы появятся там же, где и листинги.

Автор:  6797 [ Пн фев 03, 2025 22:08:03 ]
Заголовок сообщения:  Re: Си (С++) и автоматический поиск зависимостей при компиля

jcxz писал(а):
Вы хотите собрать в единый файл всё, что подключается при помощи #include что-ль?

Благодарю за наводку, но ведь собираться будет то, о чём препроцессор знает. А тут задача сложнее на мой взгляд.

Вот это определено в одном .h

Код:
typedef struct SampleString SampleString;

А вот это в другом .h

Код:
struct SampleString {
    string_tip string;
};

А вот это уже в третьем .h

Код:
typedef struct string_str {
  string_union_cttp uni;
  char *ptr;
} string_tip[1];

А вот это уже в четвёртом .h

Код:
typedef union string_union_uni {
  string_heap_cttp heap1;
  string_stack_cttp stack1;
} string_union_cttp;

А string_heap_cttp и string_stack_cttp уже в пятом .h - и так далее до хрен пойми какого уровня вложенности - десятки точно, а может и сотни.

И конечно в каждом таком .h файле объявления не только перечисленных выше типов и переменных, а ещё и других - размеры каждого .h от единиц килобайт до десятков килобайт, а объём всей уже скомпилированной прошивки устройства под мегабайт.

Вот и получается, чтобы всё это раскопать нужно:

- найти поиском по содержимому все .h файлы, где нужный неизвестный тип упоминается;
- открыть один из найденных .h файлов;
- определить просто используется нужный тип в этом .h файле или именно что определяется - если используется, переходить к следующему найденному .h файлу, если именно определяется - ура, успех.

И вот делать всё это вручную оказалось очень и очень затруднительно - хотелось бы автоматизировать. Это что касается самой задачи.


А что касается Вашего совета включить "галочку" - она ведь сработает, если препроцессор пробежится по уже вписанным include, убедится что да, все объявления имеются и уже потом сложит все их в нужное место, так? Препроцессор ведь не будет сам рыскать по десяткам директорий и перебирать сотни .h файлов, чтобы определить нужные, он ведь будет искать нужные определения в уже указанных ему инклюдах, а нужно, чтобы он искал везде, куда сможет дотянуться - с указанной директории и в её глубины.

Может такими способностями вдруг обладают какие-то системы сборки - CMake, Meson, какая-то ещё?

Автор:  shonty [ Пн фев 03, 2025 22:17:00 ]
Заголовок сообщения:  Re: Си (С++) и автоматический поиск зависимостей при компиля

6797 писал(а):
- найти поиском по содержимому все .h файлы, где нужный неизвестный тип упоминается;
откройте все файлы сразу в notepad++, а в окне поиска нажмите "найти во всех открытых документах", и свободно переключайтесь между вкладками.
За одно и подсветку синтаксиса настройте.

Добавлено after 1 minute 28 seconds:
Re: Си (С++) и автоматический поиск зависимостей при компиляции.
кстати, иде не пользуюсь, из notepad-а компилятор запускаю

Автор:  Adrift [ Пн фев 03, 2025 22:30:42 ]
Заголовок сообщения:  Re: Си (С++) и автоматический поиск зависимостей при компиля

И конечно в каждом таком .h файле объявления не только перечисленных выше типов и переменных, а ещё и других - размеры каждого .h от единиц килобайт до десятков килобайт, а объём всей уже скомпилированной прошивки устройства под мегабайт.

Зачем вам все это если найти нужно код дешифровки? Ищите функции с подходящими именами и содержимым. Или вы знаете где он, просто нужно вытащить из кода все нужное? Ну и переходите в IDE от типа к типу, там должно быть что-то типа "Go To Definition", у меня VS по F12 прыгает.

Автор:  6797 [ Пн фев 03, 2025 22:45:14 ]
Заголовок сообщения:  Re: Си (С++) и автоматический поиск зависимостей при компиля

Зачем вам все это если найти нужно код дешифровки? Ищите функции с подходящими именами и содержимым.

Так я это и делаю. Нужная функция дешифровки давно определена, но она принимает в качестве параметров несколько структур. А эти структуры заполняются путём вызова других функций, которые принимают в качестве параметров очередные структуры и нестандартные типы. И так далее.

Если бы было так просто - найти функцию дешифровки и десяток типов с ней связанных - я бы эту тему не создавал, но там жуткая лапша намотана. А само устройство, к слову, на FreeRTOS крутится.

Добавлено after 2 minutes 20 seconds:
Или вы знаете где он, просто нужно вытащить из кода все нужное? Ну и переходите в IDE от типа к типу, там должно быть что-то типа "Go To Definition", у меня VS по F12 прыгает.

Ну да, разве что попробовать действительно в Visual Studio запрыгнуть, может поможет. А то я что-то всё командными строками рулю. Спасибо.

Автор:  jcxz [ Вт фев 04, 2025 03:42:41 ]
Заголовок сообщения:  Re: Си (С++) и автоматический поиск зависимостей при компиля

Препроцессор ведь не будет сам рыскать по десяткам директорий и перебирать сотни .h файлов, чтобы определить нужные, он ведь будет искать нужные определения в уже указанных ему инклюдах, а нужно, чтобы он искал везде
Честно говоря не понял - зачем везде??? Ведь исходники у вас собираются? Так? А если так, то значит все необходимые типы подключаются препроцессором. Зачем тогда ещё и ненужный мусор тянуть? После препроцессора в файле будут только нужные .h собраны.

А искать везде, это кроме того что, бесполезно, так ещё и вредно. Ну вот найдёте вы в сторонней папке например некую DataStruct. И у вас используется DataStruct. Но ведь это может быть совершенно другая DataStruct. С таким же именем. Которая просто не подключена includ-ами. Потому и не конфликтует. Т.е. - на ровном месте создали себе же лишние проблемы.
Опять же - есть ещё пространства имён (namespace). Если они используются у вас. Как будете вручную отслеживать их влияние?
Также имена типов могут создаваться с помощью макросов. Вручную, текстовым поиском вы такие типы не найдёте.

Вы хотите выполнить работу препроцессора вручную. Это почти то же самое, что вручную на бумажке скомпилировать си-код. Вселенная не оценит подвига. :)))
Закат Солнца вручную. :)))

Автор:  6797 [ Вт фев 04, 2025 05:33:12 ]
Заголовок сообщения:  Re: Си (С++) и автоматический поиск зависимостей при компиля

jcxz, я согласен и, кажется, Ваше решение должно сработать или хотя бы облегчить решение.

Теперь бы найти как этот вывод препроцессора включить с Visual Studio Code и clang. Больше часа гуглю и не могу понять.

Автор:  GARMIN [ Ср фев 05, 2025 16:30:25 ]
Заголовок сообщения:  Re: Си (С++) и автоматический поиск зависимостей при компиля

Быстрый поиск гуглом дал ответ для GCC, возможно для clang будет также:
Получить препроцессированый файл, использую компилятор GCC можно, добавив в его вызов параметры '-E -o имя_файла.i'.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/