diff --git a/lld/ELF/InputSection.cpp b/lld/ELF/InputSection.cpp index 964bf392dd86914c8c86dea2d46891a0338ab4e9..1c01972fc8a159d4d29dc97cf1f73228ed738a8c 100644 --- a/lld/ELF/InputSection.cpp +++ b/lld/ELF/InputSection.cpp @@ -623,7 +623,9 @@ typename ELFT::uint MergeInputSection::getOffset(uintX_t Offset) const { // If Offset is not at beginning of a section piece, it is not in the map. // In that case we need to search from the original section piece vector. const SectionPiece &Piece = *this->getSectionPiece(Offset); - assert(Piece.Live); + if (!Piece.Live) + return 0; + uintX_t Addend = Offset - Piece.InputOff; return Piece.OutputOff + Addend; } diff --git a/lld/test/ELF/gc-sections-non-alloc-to-merge.s b/lld/test/ELF/gc-sections-non-alloc-to-merge.s new file mode 100644 index 0000000000000000000000000000000000000000..cdc11de888931b30555ceea3de9a61f9cd32e70b --- /dev/null +++ b/lld/test/ELF/gc-sections-non-alloc-to-merge.s @@ -0,0 +1,21 @@ +# REQUIRES: x86 + +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o +# RUN: ld.lld %t.o -o %t --gc-sections +# RUN: llvm-readobj -s --elf-output-style=GNU %t | FileCheck %s + +# CHECK: .merge1 PROGBITS {{[0-9a-z]*}} {{[0-9a-z]*}} 000004 + + .global _start +_start: + .quad .Lfoo + + .section .merge1,"aM",@progbits,4 + .p2align 2 +.Lfoo: + .long 1 +.Lbar: + .long 2 + + .section bar + .quad .Lbar