2017-03-27 71 views
0

我创建假的头文件pycparser/utils/fake_libc_include下在kernel/sched/core.c找到的每个标题,并将如何用pycparser获取Linux内核文件的函数名?

#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 

我在做什么错?我已经尝试了this博客条目的redis示例,它起作用。

回答

0

添加标题只是解决方案的一部分 - 这有助于预处理器解决#include语句。

该解决方案的另一部分是添加解析器期望在_fake_typedefs中找到的类型。这样pycparser就会知道所标识的是一种类型,并且能够正确解析代码。