Index: ELF/Driver.cpp =================================================================== --- ELF/Driver.cpp +++ ELF/Driver.cpp @@ -765,6 +765,20 @@ if (Args.hasArg(OPT_print_map)) Config->MapFile = "-"; + // With optimizations disabled, SHF_MERGE sections are just concatenated. This + // works fine for regular output, but would create a problem for -r as it + // would combine sections with different sh_entsize. + // One option would be to just copy every SHF_MERGE section as is to the + // output. While this would produce a valid ELF file with usable SHF_MERGE + // sections, tools like (llvm-)?dwarfdump get confused when they see two + // .debug_str. + // We could have separate logic for combining SHF_MERGE sections based both on + // their name and sh_entsize, but that seems to be more trouble than it is + // worth. Instead, we just require at least -O1 as that already has logic for + // handling sh_entsize. + if (Config->Relocatable) + Config->Optimize = std::max(Config->Optimize, 1u); + // --omagic is an option to create old-fashioned executables in which // .text segments are writable. Today, the option is still in use to // create special-purpose programs such as boot loaders. It doesn't Index: test/ELF/merge-reloc-O0.s =================================================================== --- /dev/null +++ test/ELF/merge-reloc-O0.s @@ -0,0 +1,48 @@ +# REQUIRES: x86 +# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o +# RUN: ld.lld %t.o -r -o %t2.o -O0 +# RUN: llvm-readobj -s -section-data %t2.o | FileCheck %s + +# We combine just the sections with the same name and sh_entsize. + +# CHECK: Name: .foo +# CHECK-NEXT: Type: SHT_PROGBITS +# CHECK-NEXT: Flags [ +# CHECK-NEXT: SHF_ALLOC +# CHECK-NEXT: SHF_MERGE +# CHECK-NEXT: ] +# CHECK-NEXT: Address: +# CHECK-NEXT: Offset: +# CHECK-NEXT: Size: 16 +# CHECK-NEXT: Link: +# CHECK-NEXT: Info: +# CHECK-NEXT: AddressAlignment: 8 +# CHECK-NEXT: EntrySize: 8 +# CHECK-NEXT: SectionData ( +# CHECK-NEXT: 0000: 41000000 00000000 42000000 00000000 +# CHECK-NEXT: ) + +# CHECK: Name: .foo +# CHECK-NEXT: Type: SHT_PROGBITS +# CHECK-NEXT: Flags [ +# CHECK-NEXT: SHF_ALLOC +# CHECK-NEXT: SHF_MERGE +# CHECK-NEXT: ] +# CHECK-NEXT: Address: +# CHECK-NEXT: Offset: +# CHECK-NEXT: Size: 8 +# CHECK-NEXT: Link: +# CHECK-NEXT: Info: +# CHECK-NEXT: AddressAlignment: 4 +# CHECK-NEXT: EntrySize: 4 +# CHECK-NEXT: SectionData ( +# CHECK-NEXT: 0000: 41000000 42000000 +# CHECK-NEXT: ) + + .section .foo, "aM",@progbits,8,unique,0 + .quad 0x41 + .section .foo, "aM",@progbits,8,unique,1 + .quad 0x42 + .section .foo, "aM",@progbits,4,unique,2 + .long 0x41 + .long 0x42