Index: lld/trunk/ELF/InputFiles.cpp =================================================================== --- lld/trunk/ELF/InputFiles.cpp +++ lld/trunk/ELF/InputFiles.cpp @@ -11,6 +11,7 @@ #include "Driver.h" #include "Error.h" #include "InputSection.h" +#include "LinkerScript.h" #include "SymbolTable.h" #include "Symbols.h" #include "llvm/ADT/STLExtras.h" @@ -162,6 +163,14 @@ if (Config->Optimize == 0) return false; + // We don't merge if linker script has SECTIONS command. When script + // do layout it can merge several sections with different attributes + // into single output sections. We currently do not support adding + // mergeable input sections to regular output ones as well as adding + // regular input sections to mergeable output. + if (ScriptConfig->HasContents) + return false; + // A mergeable section with size 0 is useless because they don't have // any data to merge. A mergeable string section with size 0 can be // argued as invalid because it doesn't end with a null character. Index: lld/trunk/test/ELF/linkerscript/linkerscript-merge-sections.s =================================================================== --- lld/trunk/test/ELF/linkerscript/linkerscript-merge-sections.s +++ lld/trunk/test/ELF/linkerscript/linkerscript-merge-sections.s @@ -0,0 +1,28 @@ +# REQUIRES: x86 +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t + +# RUN: echo "SECTIONS { .foo : { *(.foo.*) } }" > %t.script +# RUN: ld.lld -o %t1 --script %t.script %t +# RUN: llvm-objdump -s %t1 | FileCheck %s +# CHECK: Contents of section .foo: +# CHECK-NEXT: 0158 01000000 02000000 00000000 73686f72 ............shor +# CHECK-NEXT: 0168 7420756e 7369676e 65642069 6e7400 t unsigned int. + +.global _start +_start: + nop + +.section .foo.1, "aw" +writable: + .long 1 + +.section .foo.2, "aM",@progbits,1 +readable: + .long 2 + +.section .foo.3, "awx" + .long 0 + +.section .foo.4, "MS",@progbits,1 +.LASF2: + .string "short unsigned int"