Index: lld/trunk/ELF/InputSection.cpp =================================================================== --- lld/trunk/ELF/InputSection.cpp +++ lld/trunk/ELF/InputSection.cpp @@ -172,6 +172,11 @@ // Returns a source location string. Used to construct an error message. template std::string InputSectionBase::getLocation(uint64_t Offset) { + // We don't have file for synthetic sections. + if (getFile() == nullptr) + return (Config->OutputFile + ":(" + Name + "+0x" + utohexstr(Offset) + ")") + .str(); + // First check if we can get desired values from debugging information. std::string LineInfo = getFile()->getLineInfo(this, Offset); if (!LineInfo.empty()) Index: lld/trunk/test/ELF/linkerscript/eh-frame-reloc-out-of-range.s =================================================================== --- lld/trunk/test/ELF/linkerscript/eh-frame-reloc-out-of-range.s +++ lld/trunk/test/ELF/linkerscript/eh-frame-reloc-out-of-range.s @@ -0,0 +1,27 @@ +## Check that error is correctly reported when .eh_frame reloc +## is out of range + +# REQUIRES: x86 +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o +# RUN: echo "PHDRS { eh PT_LOAD; text PT_LOAD; } \ +# RUN: SECTIONS { . = 0x10000; \ +# RUN: .eh_frame_hdr : { *(.eh_frame_hdr*) } : eh \ +# RUN: .eh_frame : { *(.eh_frame) } : eh \ +# RUN: . = 0xF00000000; \ +# RUN: .text : { *(.text*) } : text \ +# RUN: }" > %t.script +# RUN: not ld.lld %t.o -T %t.script -o %t 2>&1 | FileCheck %s + +# CHECK: error: {{.*}}:(.eh_frame+0x20): relocation R_X86_64_PC32 out of range + + .text + .globl _start +_start: + .cfi_startproc + .cfi_lsda 0, _ex + nop + .cfi_endproc + + .data +_ex: + .word 0