From: Faraz Shahbazker <faraz.shahbazker@imgtec.com>
To: <gcc-patches@gcc.gnu.org>
Cc: Matthew Fortune <Matthew.Fortune@imgtec.com>
Subject: Re: [RFC] [MIPS] Enable non-executable PT_GNU_STACK support
Date: Mon, 11 Apr 2016 22:31:00 -0000 [thread overview]
Message-ID: <56CC87CE.3040505@imgtec.com> (raw)
In-Reply-To: <56B4EBAE.1090509@imgtec.com>
Bump.
On 02/05/2016 10:36 AM, Faraz Shahbazker wrote:
> 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 \
>
prev parent reply other threads:[~2016-04-11 22:31 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-02-05 18:36 Faraz Shahbazker
2016-02-23 16:26 ` Faraz Shahbazker
2016-04-11 22:31 ` Faraz Shahbazker [this message]
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=56CC87CE.3040505@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).