[PATCH] D34814: [ELF] - Fail the link if something happens on DWARF parsing stage of -gdb-index building

Rafael Avila de Espindola via llvm-commits llvm-commits at lists.llvm.org
Mon Jul 3 08:43:49 PDT 2017


LGTM

George Rimar via Phabricator <reviews at reviews.llvm.org> writes:

> grimar created this revision.
> Herald added subscribers: aprantl, emaste.
>
> This is relative to PR33173,
>
> Previously if something wrong happened on DWARF parsers side during parsing
> object for building gdb index (like was in PR: unsupported relocation) then LLD continued 
> and finished the link. DWARF parsers sure showed error message on their side, but that is all.
>
> Patch changes behavior to fail the link in this case and show more detailed message.
>
>
> https://reviews.llvm.org/D34814
>
> Files:
>   ELF/SyntheticSections.cpp
>   test/ELF/invalid/invalid-debug-relocations.test
>
>
> Index: test/ELF/invalid/invalid-debug-relocations.test
> ===================================================================
> --- test/ELF/invalid/invalid-debug-relocations.test
> +++ test/ELF/invalid/invalid-debug-relocations.test
> @@ -0,0 +1,41 @@
> +# REQUIRES: x86
> +# RUN: yaml2obj %s -o %t.o
> +# RUN: not ld.lld -gdb-index %t.o -o %t.exe 2>&1 | FileCheck %s
> +
> +# CHECK:      error: {{.*}}.o: error parsing DWARF data:
> +# CHECK-NEXT: >>> failed to compute relocation: Unknown, Invalid data was encountered while parsing the file
> +
> +!ELF
> +FileHeader:
> +  Class:           ELFCLASS32
> +  Data:            ELFDATA2LSB
> +  Type:            ET_REL
> +  Machine:         EM_386
> +Sections:
> +  - Type:            SHT_PROGBITS
> +    Name:            .text
> +    Flags:           [ ]
> +    AddressAlign:    0x04
> +    Content:         "0000"
> +  - Type:            SHT_PROGBITS
> +    Name:            .debug_info
> +    Flags:           [ ]
> +    AddressAlign:    0x04
> +    Content:         "0000"
> +  - Type:            SHT_REL
> +    Name:            .rel.debug_info
> +    Link:            .symtab
> +    Info:            .debug_info
> +    Relocations:
> +      - Offset:          0
> +        Symbol:          _start
> +        Type:            0xFF
> +      - Offset:          4
> +        Symbol:          _start
> +        Type:            0xFF
> +Symbols:
> +  Global:
> +    - Name:     _start
> +      Type:     STT_FUNC
> +      Section:  .text
> +      Value:    0x0
> Index: ELF/SyntheticSections.cpp
> ===================================================================
> --- ELF/SyntheticSections.cpp
> +++ ELF/SyntheticSections.cpp
> @@ -1810,7 +1810,11 @@
>      return {};
>    }
>  
> -  DWARFContextInMemory Dwarf(*Obj.get());
> +  DWARFContextInMemory Dwarf(*Obj.get(), nullptr, [&](Error E) {
> +    error(toString(Sec->File) + ": error parsing DWARF data:\n>>> " +
> +          toString(std::move(E)));
> +    return ErrorPolicy::Continue;
> +  });
>  
>    GdbIndexChunk Ret;
>    Ret.CompilationUnits = readCuList(Dwarf, Sec);
>
>
> Index: test/ELF/invalid/invalid-debug-relocations.test
> ===================================================================
> --- test/ELF/invalid/invalid-debug-relocations.test
> +++ test/ELF/invalid/invalid-debug-relocations.test
> @@ -0,0 +1,41 @@
> +# REQUIRES: x86
> +# RUN: yaml2obj %s -o %t.o
> +# RUN: not ld.lld -gdb-index %t.o -o %t.exe 2>&1 | FileCheck %s
> +
> +# CHECK:      error: {{.*}}.o: error parsing DWARF data:
> +# CHECK-NEXT: >>> failed to compute relocation: Unknown, Invalid data was encountered while parsing the file
> +
> +!ELF
> +FileHeader:
> +  Class:           ELFCLASS32
> +  Data:            ELFDATA2LSB
> +  Type:            ET_REL
> +  Machine:         EM_386
> +Sections:
> +  - Type:            SHT_PROGBITS
> +    Name:            .text
> +    Flags:           [ ]
> +    AddressAlign:    0x04
> +    Content:         "0000"
> +  - Type:            SHT_PROGBITS
> +    Name:            .debug_info
> +    Flags:           [ ]
> +    AddressAlign:    0x04
> +    Content:         "0000"
> +  - Type:            SHT_REL
> +    Name:            .rel.debug_info
> +    Link:            .symtab
> +    Info:            .debug_info
> +    Relocations:
> +      - Offset:          0
> +        Symbol:          _start
> +        Type:            0xFF
> +      - Offset:          4
> +        Symbol:          _start
> +        Type:            0xFF
> +Symbols:
> +  Global:
> +    - Name:     _start
> +      Type:     STT_FUNC
> +      Section:  .text
> +      Value:    0x0
> Index: ELF/SyntheticSections.cpp
> ===================================================================
> --- ELF/SyntheticSections.cpp
> +++ ELF/SyntheticSections.cpp
> @@ -1810,7 +1810,11 @@
>      return {};
>    }
>  
> -  DWARFContextInMemory Dwarf(*Obj.get());
> +  DWARFContextInMemory Dwarf(*Obj.get(), nullptr, [&](Error E) {
> +    error(toString(Sec->File) + ": error parsing DWARF data:\n>>> " +
> +          toString(std::move(E)));
> +    return ErrorPolicy::Continue;
> +  });
>  
>    GdbIndexChunk Ret;
>    Ret.CompilationUnits = readCuList(Dwarf, Sec);


More information about the llvm-commits mailing list