Index: ELF/OutputSections.cpp =================================================================== --- ELF/OutputSections.cpp +++ ELF/OutputSections.cpp @@ -212,7 +212,9 @@ // dedup'ed section groups by their signatures. For the -r, we want to pass // through all SHT_GROUP sections without merging them because merging them // creates broken section contents. - if (IS->Type == SHT_GROUP) { + // We also do not merge any SHF_GROUP sections because otherwise we + // end up with multiple SHT_GROUPs containing the same output section. + if (IS->Type == SHT_GROUP || (IS->Flags & SHF_GROUP)) { OutputSection *Out = nullptr; addInputSec(IS, OutsecName, Out); return; Index: test/ELF/relocatable-comdat2.s =================================================================== --- test/ELF/relocatable-comdat2.s +++ test/ELF/relocatable-comdat2.s @@ -0,0 +1,28 @@ +# REQUIRES: x86 +# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o +# RUN: ld.lld -r %t.o -o %t +# RUN: llvm-readobj -elf-section-groups %t | FileCheck %s + +# CHECK: Groups { +# CHECK-NEXT: Group { +# CHECK-NEXT: Name: .group +# CHECK-NEXT: Index: 2 +# CHECK-NEXT: Type: COMDAT +# CHECK-NEXT: Signature: bar +# CHECK-NEXT: Section(s) in group [ +# CHECK-NEXT: .foo (3) +# CHECK-NEXT: ] +# CHECK-NEXT: } +# CHECK-NEXT: Group { +# CHECK-NEXT: Name: .group +# CHECK-NEXT: Index: 4 +# CHECK-NEXT: Type: COMDAT +# CHECK-NEXT: Signature: zed +# CHECK-NEXT: Section(s) in group [ +# CHECK-NEXT: .foo (5) +# CHECK-NEXT: ] +# CHECK-NEXT: } +# CHECK-NEXT: } + +.section .foo,"axG",@progbits,bar,comdat +.section .foo,"axG",@progbits,zed,comdat