public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Faraz Shahbazker <faraz.shahbazker@imgtec.com>
To: <gcc-patches@gcc.gnu.org>
Cc: Matthew Fortune <Matthew.Fortune@imgtec.com>
Subject: [RFC] [MIPS] Enable non-executable PT_GNU_STACK support
Date: Fri, 05 Feb 2016 18:36:00 -0000	[thread overview]
Message-ID: <56B4EBAE.1090509@imgtec.com> (raw)

Enable non-executable stack mode if assembler and linker support it.

Currently the MIPS FPU emulator uses eXecute Out of Line (XOL) on the stack to
handle instructions in the delay slots of FPU branches.  Because of this MIPS
cannot have a non-executable stack. While the solution on the kernel side is
not yet finalized, we propose changes required on the tools-side to make them
ready for a seamless transition whenever a fixed kernel becomes available.

glibc/dynamic linker:
----
* When non-executable stack is requested, first check AT_FLAGS in the
  auxiliary vector to decide if this kernel supports a non-executable
  stack. Persist with the non-executable mode specified on the
  PT_GNU_STACK segment only if kernel supports it, else revert to an
  executable stack.

* The 25th bit (1<<24) in AT_FLAGS is reserved for use by the kernel to
  indicate that it supports a non-executable stack on MIPS.

* glibc's ABIVERSION is incremented from 3 to 5, so that applications linked
  for this glibc can't be accidentally run against older versions. ABIVERSION
  4 has been skipped over because it was chosen for IFUNC support, which is
  still under review.

Patch under review: https://sourceware.org/ml/libc-alpha/2016-01/msg00567.html

binutils:
----
* Increment the ABIVERSION to 5 for objects with non-executable stacks.

Patch under review: https://sourceware.org/ml/binutils/2016-02/msg00087.html

gcc:
----
* Check if assembler/dynamic linker support the new behaviour
  (ABIVERSION >= 5). If yes, enable non-executable stack by default
  for all objects.

gcc/ChangeLog
	* configure.ac: Check if assembler supports the new PT_GNU_STACK
	ABI change; if yes, enable non-executable stack mode by default.
	* configure: Regenerate.
	* config.in: Regenerate.
	* config/mips/mips.c: Define TARGET_ASM_FILE_END to indicate
	stack mode for each C file if LD_MIPS_GNUSTACK is enabled.

libgcc/ChangeLog
	config/mips/crti.S: Add .note.GNU-stack marker if LD_MIPS_GNUSTACK
	support is enabled.
	config/mips/crtn.S: Add .note.GNU-stack marker if LD_MIPS_GNUSTACK
	support is enabled.
	config/mips/mips16.S: Add .note.GNU-stack marker if
	LD_MIPS_GNUSTACK support is enabled.
	config/mips/vr4120-div.S: Add .note.GNU-stack marker if
	LD_MIPS_GNUSTACK support is enabled.

-- gcc/configure.ac gcc/config/mips/mip.c config/mips/crti.S config/mips/crtn.S config/mips/mips16.S config/mips/vr4120-div.S
---
 gcc/config/mips/mips.c          |    5 +++++
 gcc/configure.ac                |   23 +++++++++++++++++++++++
 libgcc/config/mips/crti.S       |    6 ++++++
 libgcc/config/mips/crtn.S       |    6 ++++++
 libgcc/config/mips/mips16.S     |    7 +++++++
 libgcc/config/mips/vr4120-div.S |    7 +++++++
 6 files changed, 54 insertions(+)

diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c
index ea18ad6..c3eefc0 100644
--- a/gcc/config/mips/mips.c
+++ b/gcc/config/mips/mips.c
@@ -20194,6 +20194,11 @@ mips_promote_function_mode (const_tree type ATTRIBUTE_UNUSED,
 #undef TARGET_HARD_REGNO_SCRATCH_OK
 #define TARGET_HARD_REGNO_SCRATCH_OK mips_hard_regno_scratch_ok
 
+#if HAVE_LD_MIPS_GNUSTACK
+#undef TARGET_ASM_FILE_END
+#define TARGET_ASM_FILE_END file_end_indicate_exec_stack
+#endif
+
 struct gcc_target targetm = TARGET_INITIALIZER;
 \f
 #include "gt-mips.h"
diff --git a/gcc/configure.ac b/gcc/configure.ac
index 0a626e9..9b8190e 100644
--- a/gcc/configure.ac
+++ b/gcc/configure.ac
@@ -4562,6 +4562,29 @@ pointers into PC-relative form.])
       AC_MSG_ERROR(
 	[Requesting --with-nan= requires assembler support for -mnan=])
     fi
+
+    AC_CACHE_CHECK([linker for GNU-stack ABI support],
+      [gcc_cv_ld_mips_gnustack],
+      [gcc_cv_ld_mips_gnustack=no
+       if test x$gcc_cv_as != x \
+	       -a x$gcc_cv_ld != x \
+	       -a x$gcc_cv_readelf != x ; then
+	 cat > conftest.s <<EOF
+.section .note.GNU-stack,"",%progbits
+EOF
+	 if $gcc_cv_as -o conftest.o conftest.s > /dev/null 2>&1 \
+	    && $gcc_cv_ld -o conftest conftest.o > /dev/null 2>&1; then
+	   abi_version=`$gcc_cv_readelf -h conftest 2>&1 | grep "ABI Version:" | cut -d: -f2 | tr -d '[[:space:]]'`
+	   if test "$abi_version" -ge 5; then
+	     gcc_cv_ld_mips_gnustack=yes
+	   fi
+	 fi
+       fi
+       rm -f conftest.s conftest.o conftest])
+    if test x$gcc_cv_ld_mips_gnustack = xyes; then
+	    AC_DEFINE(HAVE_LD_MIPS_GNUSTACK, 1,
+      [Define if your linker can handle PT_GNU_STACK segments correctly.])
+    fi
     ;;
     s390*-*-*)
     gcc_GAS_CHECK_FEATURE([.gnu_attribute support],
diff --git a/libgcc/config/mips/crti.S b/libgcc/config/mips/crti.S
index 8521d3c..aa85d94 100644
--- a/libgcc/config/mips/crti.S
+++ b/libgcc/config/mips/crti.S
@@ -21,6 +21,12 @@ a copy of the GCC Runtime Library Exception along with this program;
 see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 <http://www.gnu.org/licenses/>.  */
 
+#include "config.h"
+#if HAVE_LD_MIPS_GNUSTACK
+/* An executable stack is *not* required for these functions.  */
+	.section .note.GNU-stack,"",%progbits
+#endif
+
 /* 4 slots for argument spill area.  1 for cpreturn, 1 for stack.
    Return spill offset of 40 and 20.  Aligned to 16 bytes for n32.  */
 
diff --git a/libgcc/config/mips/crtn.S b/libgcc/config/mips/crtn.S
index d80c342..6a13b46 100644
--- a/libgcc/config/mips/crtn.S
+++ b/libgcc/config/mips/crtn.S
@@ -21,6 +21,12 @@ a copy of the GCC Runtime Library Exception along with this program;
 see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 <http://www.gnu.org/licenses/>.  */
 
+#include "config.h"
+#if HAVE_LD_MIPS_GNUSTACK
+/* An executable stack is *not* required for these functions.  */
+        .section .note.GNU-stack,"",%progbits
+#endif
+
 /* 4 slots for argument spill area.  1 for cpreturn, 1 for stack.
    Return spill offset of 40 and 20.  Aligned to 16 bytes for n32.  */
 
diff --git a/libgcc/config/mips/mips16.S b/libgcc/config/mips/mips16.S
index 5080f86..b8f6df8 100644
--- a/libgcc/config/mips/mips16.S
+++ b/libgcc/config/mips/mips16.S
@@ -48,6 +48,13 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
    values using the soft-float calling convention, but do the actual
    operation using the hard floating point instructions.  */
 
+#include "config.h"
+#if HAVE_LD_MIPS_GNUSTACK
+/* An executable stack is *not* required for these functions.  */
+        .section .note.GNU-stack,"",%progbits
+	.previous
+#endif
+
 #if defined _MIPS_SIM && (_MIPS_SIM == _ABIO32 || _MIPS_SIM == _ABIO64)
 
 /* This file contains 32-bit assembly code.  */
diff --git a/libgcc/config/mips/vr4120-div.S b/libgcc/config/mips/vr4120-div.S
index 9954bc3..262de67 100644
--- a/libgcc/config/mips/vr4120-div.S
+++ b/libgcc/config/mips/vr4120-div.S
@@ -26,6 +26,13 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
    -mfix-vr4120.  div and ddiv do not give the correct result when one
    of the operands is negative.  */
 
+#include "config.h"
+#if HAVE_LD_MIPS_GNUSTACK
+/* An executable stack is *not* required for these functions.  */
+        .section .note.GNU-stack,"",%progbits
+#endif
+	.previous
+
 	.set	nomips16
 
 #define DIV								\
-- 
1.7.9.5

             reply	other threads:[~2016-02-05 18:36 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-02-05 18:36 Faraz Shahbazker [this message]
2016-02-23 16:26 ` Faraz Shahbazker
2016-04-11 22:31 ` Faraz Shahbazker

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=56B4EBAE.1090509@imgtec.com \
    --to=faraz.shahbazker@imgtec.com \
    --cc=Matthew.Fortune@imgtec.com \
    --cc=gcc-patches@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).