2014-03-19 2 views
5

이 질문에 대한 답을 찾지 못했습니다.elf 파일에서 함수 프로토 타입을 추출하는 방법은 무엇입니까?

GDB를 사용하여 "call"명령을 사용하여 함수의 프로토 타입을 얻을 수 있습니다. 예 :

(gdb) call fn 
$1 = {void (int, int)} 0x8048414 <fn> 

그래서, GDB는 단지 ELF 파일에서 알아낼 수입니다 FN()는 무효 반환과 인수로 두 정수를합니다.

그러나 엘프 파일에서 함수 프로토 타입을 추출하려면 다른 도구를 사용해야합니다. 바람직하게는 objdump/readelf를 사용하고 싶습니다.

가능하면 누구에게 알리십니까? 불가능할 경우 GDB는 어떻게 처리합니까? elf 파일의 어느 섹션에 함수 프로토 타입이 저장되어 있습니까?

답변

4

GDB는 DWARF debuginfo를 통해 함수의 서명을 알고 있습니다. readelf -w ELF은이를 덤프합니다. Michael J. Eager가 Introduction to the DWARF Debugging Format을 읽고 싶을 것입니다. pyelftools을 사용하면 대화 형 Python 세션에서 DWARF를 탐색하고 실험 할 수 있습니다.

함수 프로토 타입을 추출하려면 subprogram 디버그 정보 항목이 필요합니다. 드워프 형식의 튜토리얼의 예는 다음과 같습니다

strndup.c strndup.c보다 완전한 샘플 구현을 위해

<1>: DW_TAG_base_type 
    DW_AT_name = int 
    DW_AT_byte_size = 4 
    DW_AT_encoding = signed 
<2>: DW_TAG_typedef 
    DW_AT_name = size_t 
    DW_AT_type = <3> 
<3>: DW_TAG_base_type 
    DW_AT_name = unsigned int 
    DW_AT_byte_size = 4 
    DW_AT_encoding = unsigned 
<4>: DW_TAG_base_type 
    DW_AT_name = long int 
    DW_AT_byte_size = 4 
    DW_AT_encoding = signed 
<5>: DW_TAG_subprogram 
    DW_AT_sibling = <10> 
    DW_AT_external = 1 
    DW_AT_name = strndup 
    DW_AT_prototyped = 1 
    DW_AT_type = <10> 
    DW_AT_low_pc = 0 
    DW_AT_high_pc = 0x7b 
<6>: DW_TAG_formal_parameter 
    DW_AT_name = s 
    DW_AT_type = <12> 
    DW_AT_location = 
    (DW_OP_fbreg: 0) 
<7>: DW_TAG_formal_parameter 
    DW_AT_name = n 
    DW_AT_type = <2> 
    DW_AT_location = 
    (DW_OP_fbreg: 4) 
<8>: DW_TAG_variable 
    DW_AT_name = result 
    DW_AT_type = <10> 
    DW_AT_location = 
    (DW_OP_fbreg: -28) 
<9>: DW_TAG_variable 
    DW_AT_name = len 
    DW_AT_type = <2> 
    DW_AT_location = 
    (DW_OP_fbreg: -24) 
<10>: DW_TAG_pointer_type 
    DW_AT_byte_size = 4 
    DW_AT_type = <11> 
<11>: DW_TAG_base_type 
    DW_AT_name = char 
    DW_AT_byte_size = 1 
    DW_AT_encoding = 
    signed char 
<12>: DW_TAG_pointer_type 
    DW_AT_byte_size = 4 
    DW_AT_type = <13> 
<13>: DW_TAG_const_type 
    DW_AT_type = <11> 

에 대한

1: #include "ansidecl.h" 
2: #include <stddef.h> 
3: 
4: extern size_t strlen (const char*); 
5: extern PTR malloc (size_t); 
6: extern PTR memcpy (PTR, const PTR, size_t); 
7: 
8: char * 
9: strndup (const char *s, size_t n) 
10: { 
11: char *result; 
12: size_t len = strlen (s); 
13: 
14: if (n < len) 
15: len = n; 
16: 
17: result = (char *) malloc (len + 1); 
18: if (!result) 
19: return 0; 
20: 
21: result[len] = '\0'; 
22: return (char *) memcpy (result, s, len); 
23: } 

DWARF 설명을 살펴 Petr Machata의 this C reflection library에 있습니다.

  • 반사 그것은 libdwelfutils에서 libdwfl에 따라 GDB
  • 처럼-의 프로세스 대신에 프로세스 실행 : 그것은 당신이 다음과 같은 경고와 함께 원하는 것을 할 수있는 코드가 있습니다. 외부 라이브러리 의존성을 키우는 것에 대해 어떻게 생각하는지 확신 할 수 없습니다.
관련 문제