Разбор исходного файла с помощью libclang - проблемы со связыванием включаемых файлов

Я написал скрипт для разбора файлов C/C++ с помощью libclang библиотека.

Файл, который я пытался проанализировать: osf_sys.c. Программа печатает каждую функцию / переменную и т. Д. В файле. Образец вывода:

...
CURSORKIND: 6; __user at line: 469
CURSORKIND: 43; struct proplistname_args at line: 469
CURSORKIND: 6; nbytes at line: 470
...

Итак, я запускаю свой скрипт ./script osf_sys.c и разбор в основном работает. Тем не менее, я заметил, что некоторые части osf_sys.c не печатались (отсутствовали переменные и так далее), и я подозреваю, что это было связано с заголовочными файлами (которые находились в отдельном каталоге). Я добавил фрагмент кода, чтобы помочь с отладкой / печатью сообщений об ошибках, показанных ниже.

Попытка 1

После построения сценария с CMakeЯ приступаю к его запуску. Это ошибка, которая печатается:

/Linux_Kernel/linux/arch/alpha/kernel/osf_sys.c:13:10:
fatal error: 'linux/errno.h' file not found

Кажется, что у него есть некоторые проблемы с поиском файлов заголовков этого osf_sys.c, Поэтому я добавил это к CMakeLists.txt (что, вероятно, неправильно, так как проблема не в компиляции моей программы, а в том, как libclang находит вещи):

-I/Linux_Kernel/linux/include

Обратите внимание, что полный путь к файлу errno.h /Linux_Kernel/linux/include/linux/errno.h

Попытка 2

Я решил перетащить весь include/ папка в тот же каталог, который osf_sys.c проживает в.

Теперь, когда он запускается, я получаю новую распечатку ошибки:

/Linux_Kernel/linux/arch/alpha/kernel/osf_sys.c:13:10: error:
'linux/errno.h' file not found with <angled> include; use "quotes" instead

с последующим:

/Linux_Kernel/linux/arch/alpha/kernel/linux/errno.h:4:10:
fatal error: 'asm/errno.h' file not found

Хорошо, теперь, кажется, что-то читает. Конечно же, речь идет о #include <linux/errno.h> от osf_sys.c файл. Второе сообщение об ошибке возникает, вероятно, потому что я не перетащил asm/ папка в тот же рабочий каталог, что и osf_sys.c,

Попытка 3

Итак, по запросу я вручную редактирую osf_sys.c изменить #include <linux/errno.h> в #include "linux.errno.h"

На этот раз у меня осталось следующее сообщение об ошибке:

/Linux_Kernel/linux/arch/alpha/kernel/linux/errno.h:4:10: 
fatal error: 'asm/errno.h' file not found

Попытка 4

Переходя -I/Linux_Kernel/linux/include в качестве аргумента в сценарий. Скрипт использует следующие параметры для CXTranslationUnit:

CXTranslationUnit translationUnit = clang_parseTranslationUnit(index, nullptr, argv, argc, 0, 0, CXTranslationUnit_KeepGoing);

Это приводит к другим видам сообщений об ошибках:

warning: 'linker' input unused [-Wunused-command-line-argument]
/Linux_Kernel/linux/arch/alpha/kernel/linux/errno.h:4:10: error: 'asm/errno.h' file not found
/Linux_Kernel/linux/include/linux/types.h:4:10: error: 'asm/types.h' file not found
...

Что осталось сделать?

У меня мало намерений редактировать все #include операторы (в каждом файле ядра Linux) использовать двойные кавычки и перетаскивая include/ папка в каждый каталог с .c файл.

Буду признателен за несколько советов о том, как сделать libclang искать include/ каталог файлов я указываю.

Любые предложения / альтернативы относительно того, как я могу решить эту проблему?

1 ответ

Для правильного разбора исходного файла вы должны перейти к clang_parseTranslationUnit (через argv) все флаги компиляции, которые использовались для компиляции ядра. Самый простой способ получить их все - это создать базу данных компиляции. Вы можете попробовать использовать медведя или искать другие инструменты. Также посмотрите на аналогичный вопрос: AST проекта Clang

Другие вопросы по тегам