Предварительная обработка произвольных проектов C
Я хочу написать хорошую программу callgraph на python, и по этой причине я использую pycparser.
Pycparser должен предварительно обработать файлы c, чтобы правильно создать абстрактное синтаксическое дерево. Мой первый подход состоял в том, чтобы использовать только -E
опцию gcc для файлов и затем передать ее pycparser. Но с разными проектами я получаюNo such file or directory
"ошибки, потому что gcc не находит определенные заголовки. Если я попытаюсь предварительно обработать ядро Linux с gcc -E `find | grep "\.c"\`
он пропускает некоторые заголовочные файлы, такие как файлы с префиксом Linux/, поскольку такой папки нет. Мне кажется, что мне нужны некоторые дополнительные флаги для gcc, чтобы передать расположение заголовочных файлов и правильно обработать. Есть ли общий способ предварительной обработки произвольных проектов C?
Кроме того, я предполагаю, что, если мне удастся правильно выполнить предварительную обработку, в разных файлах будет несколько копий одной и той же функции. Есть ли способ определить исходный файл функции?
1 ответ
Вы должны прочитать о том, как GCC находит заголовочные файлы, по крайней мере, включая ключи командной строки компилятора и переменные среды для путей поиска.
Я подозреваю, что сценарии сборки для различных переменных конфигурации набора проектов влияют на то, как GCC находит файлы заголовков для любой конкретной компиляции. Многие такие сценарии даже выполняют подстановку макросов в командной строке, что означает, что вы должны знать, что делает сценарий.
Если вы изолируете исходный файл C от скрипта make, который устанавливает контекст сборки, GCC не найдет правильные заголовки. И это твоя проблема.
Вам, вероятно, нужно запустить сценарии сборки и перехватить вызовы GCC, чтобы получить необходимый контекст.