[lld] r284226 - [ELF] - Implemented -z wxneeded.

George Rimar via llvm-commits llvm-commits at lists.llvm.org
Fri Oct 14 03:34:37 PDT 2016


Author: grimar
Date: Fri Oct 14 05:34:36 2016
New Revision: 284226

URL: http://llvm.org/viewvc/llvm-project?rev=284226&view=rev
Log:
[ELF] - Implemented -z wxneeded.

-z wxneeded creates a PHDR PT_OPENBSD_WXNEEDED.

PT_OPENBSD_WXNEEDED
The array element specifies that a process executing this file may need to be able to map or protect memory regions as simultaneously executable and writable. If the system is unable or unwilling to permit that for this executable then it may fail immediately. This segment type is meaningful only for executable files and is ignored in other objects.

http://man.openbsd.org/OpenBSD-current/man5/elf.5

Differential revision: https://reviews.llvm.org/D25472

Added:
    lld/trunk/test/ELF/linkerscript/openbsd-wxneeded.s
    lld/trunk/test/ELF/openbsd-wxneeded.s
Modified:
    lld/trunk/ELF/Config.h
    lld/trunk/ELF/Driver.cpp
    lld/trunk/ELF/LinkerScript.cpp
    lld/trunk/ELF/Writer.cpp

Modified: lld/trunk/ELF/Config.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Config.h?rev=284226&r1=284225&r2=284226&view=diff
==============================================================================
--- lld/trunk/ELF/Config.h (original)
+++ lld/trunk/ELF/Config.h Fri Oct 14 05:34:36 2016
@@ -126,6 +126,7 @@ struct Configuration {
   bool ZNow;
   bool ZOrigin;
   bool ZRelro;
+  bool ZWxneeded;
   DiscardPolicy Discard;
   SortSectionPolicy SortSection;
   StripPolicy Strip = StripPolicy::None;

Modified: lld/trunk/ELF/Driver.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Driver.cpp?rev=284226&r1=284225&r2=284226&view=diff
==============================================================================
--- lld/trunk/ELF/Driver.cpp (original)
+++ lld/trunk/ELF/Driver.cpp Fri Oct 14 05:34:36 2016
@@ -494,6 +494,7 @@ void LinkerDriver::readConfigs(opt::Inpu
   Config->ZNow = hasZOption(Args, "now");
   Config->ZOrigin = hasZOption(Args, "origin");
   Config->ZRelro = !hasZOption(Args, "norelro");
+  Config->ZWxneeded = hasZOption(Args, "wxneeded");
 
   if (!Config->Relocatable)
     Config->Strip = getStripOption(Args);

Modified: lld/trunk/ELF/LinkerScript.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/LinkerScript.cpp?rev=284226&r1=284225&r2=284226&view=diff
==============================================================================
--- lld/trunk/ELF/LinkerScript.cpp (original)
+++ lld/trunk/ELF/LinkerScript.cpp Fri Oct 14 05:34:36 2016
@@ -1720,6 +1720,7 @@ unsigned ScriptParser::readPhdrType() {
                      .Case("PT_GNU_EH_FRAME", PT_GNU_EH_FRAME)
                      .Case("PT_GNU_STACK", PT_GNU_STACK)
                      .Case("PT_GNU_RELRO", PT_GNU_RELRO)
+                     .Case("PT_OPENBSD_WXNEEDED", PT_OPENBSD_WXNEEDED)
                      .Default(-1);
 
   if (Ret == (unsigned)-1) {

Modified: lld/trunk/ELF/Writer.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Writer.cpp?rev=284226&r1=284225&r2=284226&view=diff
==============================================================================
--- lld/trunk/ELF/Writer.cpp (original)
+++ lld/trunk/ELF/Writer.cpp Fri Oct 14 05:34:36 2016
@@ -1109,6 +1109,13 @@ std::vector<PhdrEntry<ELFT>> Writer<ELFT
       Hdr.H.p_memsz = Config->ZStackSize;
   }
 
+  // PT_OPENBSD_WXNEEDED is a OpenBSD-specific header to mark the executable
+  // is expected to perform W^X violations, such as calling mprotect(2) or
+  // mmap(2) with PROT_WRITE | PROT_EXEC, which is prohibited by default on
+  // OpenBSD.
+  if (Config->ZWxneeded)
+    AddHdr(PT_OPENBSD_WXNEEDED, PF_X);
+
   if (Note.First)
     Ret.push_back(std::move(Note));
   return Ret;

Added: lld/trunk/test/ELF/linkerscript/openbsd-wxneeded.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/linkerscript/openbsd-wxneeded.s?rev=284226&view=auto
==============================================================================
--- lld/trunk/test/ELF/linkerscript/openbsd-wxneeded.s (added)
+++ lld/trunk/test/ELF/linkerscript/openbsd-wxneeded.s Fri Oct 14 05:34:36 2016
@@ -0,0 +1,17 @@
+# RUN: llvm-mc -filetype=obj -triple=i686-unknown-linux %s -o %t.o
+# RUN: echo "PHDRS { text PT_LOAD FILEHDR PHDRS; wxneeded PT_OPENBSD_WXNEEDED; }" > %t.script
+# RUN: ld.lld -z wxneeded --script %t.script %t.o -o %t
+# RUN: llvm-readobj --program-headers %t | FileCheck %s
+
+# CHECK:      ProgramHeader {
+# CHECK:        Type:  (0x65A3DBE7)
+# CHECK-NEXT:   Offset: 0x0
+# CHECK-NEXT:   VirtualAddress: 0x0
+# CHECK-NEXT:   PhysicalAddress: 0x0
+# CHECK-NEXT:   FileSize: 0
+# CHECK-NEXT:   MemSize: 0
+# CHECK-NEXT:   Flags [
+# CHECK-NEXT:     PF_R
+# CHECK-NEXT:   ]
+# CHECK-NEXT:   Alignment: 0
+# CHECK-NEXT: }

Added: lld/trunk/test/ELF/openbsd-wxneeded.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/openbsd-wxneeded.s?rev=284226&view=auto
==============================================================================
--- lld/trunk/test/ELF/openbsd-wxneeded.s (added)
+++ lld/trunk/test/ELF/openbsd-wxneeded.s Fri Oct 14 05:34:36 2016
@@ -0,0 +1,17 @@
+# REQUIRES: x86
+# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t
+# RUN: ld.lld -z wxneeded %t -o %t.out
+# RUN: llvm-readobj --program-headers %t.out | FileCheck %s
+
+# CHECK:      ProgramHeader {
+# CHECK:        Type:  (0x65A3DBE7)
+# CHECK-NEXT:   Offset: 0x0
+# CHECK-NEXT:   VirtualAddress: 0x0
+# CHECK-NEXT:   PhysicalAddress: 0x0
+# CHECK-NEXT:   FileSize: 0
+# CHECK-NEXT:   MemSize: 0
+# CHECK-NEXT:   Flags [
+# CHECK-NEXT:     PF_X
+# CHECK-NEXT:   ]
+# CHECK-NEXT:   Alignment: 0
+# CHECK-NEXT: }




More information about the llvm-commits mailing list