Разбор исходного файла с помощью 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/, который я указываю.

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


person JTJM    schedule 23.04.2018    source источник
comment
Вы можете повторить попытку № 3, но также добавить каталог include, содержащий asm/errno.h   -  person Increasingly Idiotic    schedule 23.04.2018
comment
Вы когда-нибудь решали это? Кажется, я в той же лодке, что и ты.   -  person LambdaScientist    schedule 06.08.2019


Ответы (1)


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

person AlexDenisov    schedule 24.04.2018