Разбор исходного файла с помощью 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