2012-11-28 12 views
0

,objdump를/GCC - BFD : 드워프 오류 : objdump를 사용하여 어셈블리 코드를 생성하는 중에 (소스 코드와 혼합) 망가 행 번호 섹션

gcc -g -c test.c ; 
objdump -S -M intel test.o > out.asm 

나는 다음과 같은 오류가 발생합니다.

BFD: Dwarf Error: mangled line number section. 

생성 된 출력 어셈블리는 소스 코드와 섞이지 않습니다. 누군가가 이것이 무엇을 의미하는지 명확히 할 수 있습니까? 이 문제를 해결할 수있는 방법이 있습니까?

답변

0

"objdump를 -S -M"분명히 .o 인 파일에서 ".debug_abbrev 섹션"섹션을 기대하고있다 "GCC -g"분명히을 작성되지 않습니다

내가 거기에 생각하지 않습니다 (디버그 기호를 포함하기 위해 이미 "-g"를 사용하고 있습니다.) 그리고 나는 무시하는 것이 안전하다고 생각합니다.

"binutils"입니다. 여기에 전체 코드는 다음과 같습니다

http://opensource.apple.com/source/binutils/binutils-20/src/bfd/dwarf2.c

/* In DWARF version 2, the description of the debugging information is 
    stored in a separate .debug_abbrev section. Before we read any 
    dies from a section we read in all abbreviations and install them 
    in a hash table. */ 

static struct abbrev_info** 
read_abbrevs (abfd, offset) 
    bfd * abfd; 
    unsigned int offset; 
{ 
    struct abbrev_info **abbrevs; 
    char *abbrev_ptr; 
    struct abbrev_info *cur_abbrev; 
    unsigned int abbrev_number, bytes_read, abbrev_name; 
    unsigned int abbrev_form, hash_number; 
    struct dwarf2_debug *stash; 

    stash = elf_tdata(abfd)->dwarf2_find_line_info; 

    if (! stash->dwarf_abbrev_buffer) 
    { 
     asection *msec; 

     msec = bfd_get_section_by_name (abfd, ".debug_abbrev"); 
     if (! msec) 
    { 
     (*_bfd_error_handler) (_("Dwarf Error: Can't find .debug_abbrev section.")); 
     bfd_set_error (bfd_error_bad_value); 
     return 0; 
    } 
+0

소스와 섞음 이 오류가 발생하면 코드가 작동하지 않습니다. 거기에 대한 수정 프로그램이 있습니까? – Jean

+0

예 : "gcc -S"를 사용하여 objdump 대신 어셈블리를 생성하십시오. – paulsm4

0

이 문제는 일반적으로 문제 코딩 링커 (LD)에 의한 .debug_line 내 섹션의 재배치 테이블 문제 보여주는 - 중복 메모리 복사합니다. 툴체인은 버그 수정과 재구성이 필요합니다.

프로그램로드 및 실행에 영향을주지 않지만,이 문제는 주소/기호가 일치하지 않아 디버깅을 불가능하게합니다. 다음은 예제이며 코드는 0x0038ca82 (잘못된 링커의 경우)에서 엉망입니다.

0038ca60 62 6c 69 63 2e 68 00 01 00 00 68 65 61 70 5f 6d |blic.h....heap_m| 
0038ca70 67 72 5f 70 75 62 6c 69 63 2e 68 00 02 00 00 00 |gr_public.h.....| 
0038ca80 00 05 32 00 40 18 02 94 32 00 40 00 01 01 00 05 |[email protected]@.....| 
0038ca90 02 94 32 00 40 00 01 01 00 05 02 94 32 00 40 00 |[email protected]@.| 
0038caa0 01 01 00 05 32 00 40 15 02 b0 32 00 40 00 01 01 |[email protected]@...| 
0038cab0 00 05 02 b0 32 00 40 00 01 01 00 05 02 b0 32 00 |[email protected]| 
0038cac0 40 00 01 01 00 05 02 c0 32 00 40 94 00 05 40 17 |@[email protected]@.| 

정상 LD가 ELF를 초래 :

0038ca80 00 = op_code = DW_LNS_extended_op 
0038ca81 05 = op length = 5 bytes 
0038ca82 02 = extended_op_code = DW_LNE_set_address 
0038ca83 nn nn nn nn = 4-byte address 

이된다는 문제가 연결된 ELF에서, 확장 연산 코드 (32 미정)

0038ca82 32 = extended_op_code = Unknown -> mangled line number section 

문제 LD는 ELF (망가 행 번호 섹션) 결과 :

0038ca60 62 6c 69 63 2e 68 00 01 00 00 68 65 61 70 5f 6d |blic.h....heap_m| 
0038ca70 67 72 5f 70 75 62 6c 69 63 2e 68 00 02 00 00 00 |gr_public.h.....| 
0038ca80 00 05 02 80 32 00 40 38 00 05 02 80 32 00 40 18 |[email protected]@.| 
0038ca90 00 05 02 90 32 00 40 1a 00 05 02 94 32 00 40 00 |[email protected]@.| 
0038caa0 01 01 00 05 02 a0 32 00 40 49 00 05 02 a0 32 00 |[email protected]| 
0038cab0 40 15 00 05 02 ac 32 00 40 15 00 05 02 b0 32 00 |@[email protected]| 
0038cac0 40 00 01 01 00 05 02 c0 32 00 40 94 00 05 02 c0 |@[email protected]|