[lld] r254039 - ELF: Omit PT_GNU_STACK segment if -z execstack is provided.
Rui Ueyama via llvm-commits
llvm-commits at lists.llvm.org
Tue Nov 24 15:42:33 PST 2015
Author: ruiu
Date: Tue Nov 24 17:42:33 2015
New Revision: 254039
URL: http://llvm.org/viewvc/llvm-project?rev=254039&view=rev
Log:
ELF: Omit PT_GNU_STACK segment if -z execstack is provided.
In the previous patch (r254003), I made the linker emit PT_GNU_STACK
unconditionally. But sometimes you want to have a control over the
presence of the segment. With this patch, you can omit the segment
by passing -z execstack option.
Modified:
lld/trunk/ELF/Writer.cpp
lld/trunk/test/ELF/gnustack.s
Modified: lld/trunk/ELF/Writer.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Writer.cpp?rev=254039&r1=254038&r2=254039&view=diff
==============================================================================
--- lld/trunk/ELF/Writer.cpp (original)
+++ lld/trunk/ELF/Writer.cpp Tue Nov 24 17:42:33 2015
@@ -933,12 +933,11 @@ template <class ELFT> void Writer<ELFT>:
// 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 <class ELFT> void Writer<ELFT>:
// 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))
Modified: lld/trunk/test/ELF/gnustack.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/gnustack.s?rev=254039&r1=254038&r2=254039&view=diff
==============================================================================
--- lld/trunk/test/ELF/gnustack.s (original)
+++ lld/trunk/test/ELF/gnustack.s Tue Nov 24 17:42:33 2015
@@ -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:
More information about the llvm-commits
mailing list