Index: ELF/Writer.cpp
===================================================================
--- ELF/Writer.cpp
+++ ELF/Writer.cpp
@@ -933,12 +933,11 @@
 
   // PT_GNU_STACK is a special section to tell the loader to make the
   // pages for the stack non-executable.
-  Elf_Phdr *PH = &Phdrs[++PhdrIdx];
-  PH->p_type = PT_GNU_STACK;
-  if (Config->ZExecStack)
-    PH->p_flags = PF_R | PF_W | PF_X;
-  else
+  if (!Config->ZExecStack) {
+    Elf_Phdr *PH = &Phdrs[++PhdrIdx];
+    PH->p_type = PT_GNU_STACK;
     PH->p_flags = PF_R | PF_W;
+  }
 
   // Fix up PT_INTERP as we now know the address of .interp section.
   if (Interp) {
@@ -962,11 +961,13 @@
 // Returns the number of PHDR entries.
 template <class ELFT> int Writer<ELFT>::getPhdrsNum() const {
   bool Tls = false;
-  int I = 3; // 3 for PT_PHDR, first PT_LOAD and PT_GNU_STACK
+  int I = 2; // 2 for PT_PHDR and first PT_LOAD
   if (needsInterpSection())
     ++I;
   if (isOutputDynamic())
     ++I;
+  if (!Config->ZExecStack)
+    ++I;
   uintX_t Last = PF_R;
   for (OutputSectionBase<ELFT> *Sec : OutputSections) {
     if (!needsPhdr<ELFT>(Sec))
Index: test/ELF/gnustack.s
===================================================================
--- test/ELF/gnustack.s
+++ test/ELF/gnustack.s
@@ -1,46 +1,29 @@
 # REQUIRES: x86
 # RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t1
 # RUN: ld.lld %t1 -z execstack -o %t
-# RUN: llvm-readobj --program-headers -s %t | FileCheck --check-prefix=CHECK_RWX %s
+# RUN: llvm-readobj --program-headers -s %t | FileCheck --check-prefix=RWX %s
 # RUN: ld.lld %t1 -o %t
-# RUN: llvm-readobj --program-headers -s %t | FileCheck --check-prefix=CHECK_RW %s
+# RUN: llvm-readobj --program-headers -s %t | FileCheck --check-prefix=RW %s
 
-# CHECK_RW:       Sections [
-# CHECK_RW-NOT:   Name: .note.GNU-stack
-# CHECK_RW:       ProgramHeaders [
-# CHECK_RW:        ProgramHeader {
-# CHECK_RW:        Type: PT_GNU_STACK
-# CHECK_RW-NEXT:   Offset: 0x0
-# CHECK_RW-NEXT:   VirtualAddress: 0x0
-# CHECK_RW-NEXT:   PhysicalAddress: 0x0
-# CHECK_RW-NEXT:   FileSize: 0
-# CHECK_RW-NEXT:   MemSize: 0
-# CHECK_RW-NEXT:   Flags [
-# CHECK_RW-NEXT:     PF_R
-# CHECK_RW-NEXT:     PF_W
-# CHECK_RW-NEXT:   ]
-# CHECK_RW-NEXT:   Alignment: 0
-# CHECK_RW-NEXT:   }
-# CHECK_RW-NEXT: ]
+# RW:       Sections [
+# RW-NOT:   Name: .note.GNU-stack
+# RW:       ProgramHeaders [
+# RW:        ProgramHeader {
+# RW:        Type: PT_GNU_STACK
+# RW-NEXT:   Offset: 0x0
+# RW-NEXT:   VirtualAddress: 0x0
+# RW-NEXT:   PhysicalAddress: 0x0
+# RW-NEXT:   FileSize: 0
+# RW-NEXT:   MemSize: 0
+# RW-NEXT:   Flags [
+# RW-NEXT:     PF_R
+# RW-NEXT:     PF_W
+# RW-NEXT:   ]
+# RW-NEXT:   Alignment: 0
+# RW-NEXT:   }
+# RW-NEXT: ]
 
-# CHECK_RWX:       Sections [
-# CHECK_RWX-NOT:   Name: .note.GNU-stack
-# CHECK_RWX:       ProgramHeaders [
-# CHECK_RWX:        ProgramHeader {
-# CHECK_RWX:        Type: PT_GNU_STACK
-# CHECK_RWX-NEXT:   Offset: 0x0
-# CHECK_RWX-NEXT:   VirtualAddress: 0x0
-# CHECK_RWX-NEXT:   PhysicalAddress: 0x0
-# CHECK_RWX-NEXT:   FileSize: 0
-# CHECK_RWX-NEXT:   MemSize: 0
-# CHECK_RWX-NEXT:   Flags [
-# CHECK_RWX-NEXT:     PF_R
-# CHECK_RWX-NEXT:     PF_W
-# CHECK_RWX-NEXT:     PF_X
-# CHECK_RWX-NEXT:   ]
-# CHECK_RWX-NEXT:   Alignment: 0
-# CHECK_RWX-NEXT:   }
-# CHECK_RWX-NEXT: ]
+# RWX-NOT: Type: PT_GNU_STACK
 
 .globl _start
 _start: