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"