2017-03-27 4 views
0

나는 kernel/sched/core.c에서 발견 된 모든 헤더 pycparser/utils/fake_libc_include에서 가짜 헤더 파일을 생성하고 그들에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는 식별 된 타입을 알 수 있고 코드를 올바르게 파싱 할 수 있습니다.