Index: lld/trunk/ELF/InputSection.cpp =================================================================== --- lld/trunk/ELF/InputSection.cpp +++ lld/trunk/ELF/InputSection.cpp @@ -80,6 +80,12 @@ if (V > UINT32_MAX) fatal(toString(File) + ": section sh_addralign is too large"); Alignment = V; + + // If it is not a mergeable section, overwrite the flag so that the flag + // is consistent with the class. This inconsistency could occur when + // string merging is disabled using -O0 flag. + if (!Config->Relocatable && !isa>(this)) + this->Flags &= ~(SHF_MERGE | SHF_STRINGS); } template Index: lld/trunk/test/ELF/merge-string.s =================================================================== --- lld/trunk/test/ELF/merge-string.s +++ lld/trunk/test/ELF/merge-string.s @@ -61,8 +61,6 @@ // NOMERGE-NEXT: Type: SHT_PROGBITS // NOMERGE-NEXT: Flags [ // NOMERGE-NEXT: SHF_ALLOC -// NOMERGE-NEXT: SHF_MERGE -// NOMERGE-NEXT: SHF_STRINGS // NOMERGE-NEXT: ] // NOMERGE-NEXT: Address: 0x1C8 // NOMERGE-NEXT: Offset: 0x1C8 Index: lld/trunk/test/ELF/no-merge.s =================================================================== --- lld/trunk/test/ELF/no-merge.s +++ lld/trunk/test/ELF/no-merge.s @@ -0,0 +1,25 @@ +# REQUIRES: x86 +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o +# RUN: echo "SECTIONS { .data : {*(.data.*)} }" > %t0.script +# RUN: ld.lld %t.o -o %t0.out --script %t0.script +# RUN: llvm-objdump -s %t0.out | FileCheck %s --check-prefix=OPT +# OPT: Contents of section .data: +# OPT-NEXT: 0000 01 +# OPT-NEXT: Contents of section .data: +# OPT-NEXT: 0001 6100 +# OPT-NEXT: Contents of section .data: +# OPT-NEXT: 0003 03 + +# RUN: ld.lld -O0 %t.o -o %t1.out --script %t0.script +# RUN: llvm-objdump -s %t1.out | FileCheck %s --check-prefix=NOOPT +# NOOPT: Contents of section .data: +# NOOPT-NEXT: 0000 01610003 + +.section .data.aw,"aw",@progbits +.byte 1 + +.section .data.ams,"aMS",@progbits,1 +.asciz "a" + +.section .data.am,"aM",@progbits,1 +.byte 3