Как получить имена функций файлов ядра Linux с помощью pycparser?

Я создал поддельные заголовочные файлы под pycparser/utils/fake_libc_include для каждого заголовка, найденного в kernel/sched/core.c и положи

#include "_fake_defines.h"
#include "_fake_typedefs.h"

в них. Несколько других заголовочных файлов отсутствовали, например, много заголовков из файла kernel/sched/sched.h. Так что я их тоже добавил.

Предварительно обработан весь материал с

gcc -nostdinc -E -Ipycparser/utils/fake_libc_include ../kernel/sched/core.c > core_pp.c

который не дал ошибки.

Поэтому я попытался получить имена функций

python3 examples/func_defs.py core_pp.c

но это дает мне ошибку:

Traceback (most recent call last):
  File "examples/func_defs.py", line 46, in <module>
    show_func_defs(filename)
  File "examples/func_defs.py", line 34, in show_func_defs
    cpp_args=r'-Iutils/fake_libc_include')
  File "/usr/local/lib/python3.4/dist-packages/pycparser/__init__.py", line 93, in parse_file
    return parser.parse(text, filename)
  File "/usr/local/lib/python3.4/dist-packages/pycparser/c_parser.py", line 151, in parse
    debug=debuglevel)
  File "/usr/local/lib/python3.4/dist-packages/pycparser/ply/yacc.py", line 331, in parse
    return self.parseopt_notrack(input, lexer, debug, tracking, tokenfunc)
  File "/usr/local/lib/python3.4/dist-packages/pycparser/ply/yacc.py", line 1181, in parseopt_notrack
    tok = call_errorfunc(self.errorfunc, errtoken, self)
  File "/usr/local/lib/python3.4/dist-packages/pycparser/ply/yacc.py", line 193, in call_errorfunc
    r = errorfunc(token)
  File "/usr/local/lib/python3.4/dist-packages/pycparser/c_parser.py", line 1721, in p_error
    column=self.clex.find_tok_column(p)))
  File "/usr/local/lib/python3.4/dist-packages/pycparser/plyparser.py", line 55, in _parse_error
    raise ParseError("%s: %s" % (coord, msg))
pycparser.plyparser.ParseError: ../kernel/sched/cpupri.h:14:2: before: atomic_t

Что я делаю неправильно? Я попробовал пример redis из этой записи в блоге, и это сработало.

1 ответ

Добавление заголовков - это только одна часть решения - это помогает препроцессору решить #include заявления.

Другая часть решения заключается в добавлении типов, которые синтаксический анализатор может там найти, к _fake_typedefs. Таким образом pycparser будет знать, что идентифицированный тип является типом, и сможет правильно проанализировать код.

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