Форум РадиоКот 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/ |