diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp index b24b4ed3809b..fba35fbb0ce2 100644 --- a/lld/ELF/Writer.cpp +++ b/lld/ELF/Writer.cpp @@ -933,12 +933,11 @@ template void Writer::assignAddresses() { // 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 @@ template void Writer::assignAddresses() { // Returns the number of PHDR entries. template int Writer::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 *Sec : OutputSections) { if (!needsPhdr(Sec)) diff --git a/lld/test/ELF/gnustack.s b/lld/test/ELF/gnustack.s index 261d4157506b..6fc937354e69 100644 --- a/lld/test/ELF/gnustack.s +++ b/lld/test/ELF/gnustack.s @@ -1,46 +1,30 @@ # 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: Name: .note.GNU-stack +# RWX-NOT: Type: PT_GNU_STACK .globl _start _start: