Index: ELF/InputFiles.cpp =================================================================== --- ELF/InputFiles.cpp +++ ELF/InputFiles.cpp @@ -121,11 +121,22 @@ DWARFDataExtractor LineData(Obj, Obj.getLineSection(), Config->IsLE, Config->Wordsize); - // The second parameter is offset in .debug_line section - // for compilation unit (CU) of interest. We have only one - // CU (object file), so offset is always 0. - const DWARFDebugLine::LineTable *LT = - DwarfLine->getOrParseLineTable(LineData, 0, Dwarf, nullptr); + const DWARFDebugLine::LineTable *LT = nullptr; + // The second parameter in getOrParseLineTable is the offset in the + // .debug_line section for the compilation unit (CU) of interest. We assume we + // have only one CU (object file), so the offset is always 0. + // FIXME: Under some circustances, we can have more than one CU, e.g. objects + // built via -r links or LTO. See PR36793. + if (LineData.isValidOffset(0)) { + Expected ErrOrLineTable = + DwarfLine->getOrParseLineTable(LineData, 0, Dwarf, nullptr, warn); + if (ErrOrLineTable) + LT = *ErrOrLineTable; + else + handleAllErrors(ErrOrLineTable.takeError(), + [&](DebugLineError &Err) { warn(Err.message()); }, + [&](ErrorInfoBase &Err) { error(Err.message()); }); + } if (!LT) return; Index: test/ELF/Inputs/undef-bad-debug.s =================================================================== --- test/ELF/Inputs/undef-bad-debug.s +++ test/ELF/Inputs/undef-bad-debug.s @@ -1,7 +1,37 @@ .section .text,"ax" sym: .quad zed6 - + +.section .debug_line,"",@progbits + .long .Lunit_end - .Lunit_start # unit length +.Lunit_start: + .short 4 # version + .long .Lprologue_end - .Lprologue_start # prologue length +.Lprologue_start: + .byte 1 # minimum instruction length + .byte 1 # maximum operatiosn per instruction + .byte 1 # default is_stmt + .byte -5 # line base + .byte 14 # line range + .byte 13 # opcode base + .byte 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1 # standard opcode lengths + .asciz "dir" # include directories + .byte 0 + .asciz "undef-bad-debug.s" # file names + .byte 1, 0, 0 + .byte 0 + .byte 0 # extraneous byte +.Lprologue_end: + .byte 0, 9, 2 # DW_LNE_set_address + .quad sym + .byte 3 # DW_LNS_advance_line + .byte 10 + .byte 1 # DW_LNS_copy + .byte 2 # DW_LNS_advance_pc + .byte 8 + .byte 0, 1, 1 # DW_LNE_end_sequence +.Lunit_end: + .section .debug_info,"",@progbits .long .Lcu_end - .Lcu_start # Length of Unit .Lcu_start: Index: test/ELF/no-line-parser-errors-if-empty-section.s =================================================================== --- test/ELF/no-line-parser-errors-if-empty-section.s +++ test/ELF/no-line-parser-errors-if-empty-section.s @@ -0,0 +1,21 @@ +# REQUIRES: x86 + +# LLD uses the debug data to get information for error messages, if possible. +# However, if the debug line section is empty, we should not attempt to parse +# it, as that would result in errors from the parser. + +# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o +# RUN: not ld.lld %t.o -o %t.elf 2>&1 | FileCheck %s + +# CHECK-NOT: warning: +# CHECK-NOT: error: +# CHECK: error: undefined symbol: undefined +# CHECK-NEXT: {{.*}}.o:(.text+0x1) +# CHECK-NOT: warning: +# CHECK-NOT: error: + +.globl _start +_start: + callq undefined + +.section .debug_line,"",@progbits Index: test/ELF/no-line-parser-errors-if-no-section.s =================================================================== --- test/ELF/no-line-parser-errors-if-no-section.s +++ test/ELF/no-line-parser-errors-if-no-section.s @@ -0,0 +1,19 @@ +# REQUIRES: x86 + +# LLD uses the debug data to get information for error messages, if possible. +# However, if there is no debug line section, we should not attempt to parse +# it, as that would result in errors from the parser. + +# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o +# RUN: not ld.lld %t.o -o %t.elf 2>&1 | FileCheck %s + +# CHECK-NOT: warning: +# CHECK-NOT: error: +# CHECK: error: undefined symbol: undefined +# CHECK-NEXT: {{.*}}.o:(.text+0x1) +# CHECK-NOT: warning: +# CHECK-NOT: error: + +.globl _start +_start: + callq undefined Index: test/ELF/undef.s =================================================================== --- test/ELF/undef.s +++ test/ELF/undef.s @@ -34,6 +34,7 @@ # CHECK: >>> referenced by undef-debug.s:11 (dir{{/|\\}}undef-debug.s:11) # CHECK: >>> {{.*}}.o:(.text.2+0x0) +# CHECK: warning: parsing line table prologue at 0x00000000 should have ended at 0x00000038 but it ended at 0x00000037 # CHECK: error: undefined symbol: zed6 # CHECK: >>> referenced by {{.*}}tmp4.o:(.text+0x0)