Index: ELF/SyntheticSections.cpp =================================================================== --- ELF/SyntheticSections.cpp +++ ELF/SyntheticSections.cpp @@ -2929,8 +2929,10 @@ // We do not want to handle sections that are not alive, so just remove // them instead of trying to merge. - if (!MS->Live) + if (!MS->Live) { + S = nullptr; continue; + } StringRef OutsecName = getOutputSectionName(MS); uint32_t Alignment = std::max(MS->Alignment, MS->Entsize); Index: test/ELF/x86-64-reloc-error2.s =================================================================== --- test/ELF/x86-64-reloc-error2.s +++ test/ELF/x86-64-reloc-error2.s @@ -1,14 +1,25 @@ # REQUIRES: x86 # RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o -# RUN: not ld.lld %t.o -o /dev/null 2>&1 | FileCheck %s +# RUN: not ld.lld --entry=func -Ttext=0x80000000 --gc-sections %t.o -o /dev/null 2>&1 | FileCheck %s ## Check we are able to find a function symbol that encloses ## a given location when reporting error messages. -# CHECK: {{.*}}.o:(function func): relocation R_X86_64_32S out of range: -281474974609408 is not in [-2147483648, 2147483647] +# CHECK: {{.*}}.o:(function func): relocation R_X86_64_32S out of range: 2147487744 is not in [-2147483648, 2147483647] + +# This section will be garbage collected. +# It is here to check no MergeInputSection (which is not a subclass of InputSection) +# is in InputSections after mergeSections is called. +# If this section is kept, cast(D) in getErrPlace will cause an assertion failure. +.section .rodata.str1.1,"aMS",@progbits,1 +.asciz "b" + +.section .rodata.str1.2,"aMS",@progbits,1 +foo: +.asciz "a" .section .text.func, "ax", %progbits .globl func .type func,@function -.size func, 0x10 func: - movq func - 0x1000000000000, %rdx + movq $foo, %rdx +.size func, .-func