This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[PATCH v5] Mips support for PT_GNU_STACK
- From: Dragan Mladjenovic <dmladjenovic at wavecomp dot com>
- To: "libc-alpha at sourceware dot org" <libc-alpha at sourceware dot org>
- Cc: Dragan Mladjenovic <dmladjenovic at wavecomp dot com>, Joseph Myers <joseph at codesourcery dot com>, Carlos O'Donell <carlos at redhat dot com>, Adhemerval Zanella <adhemerval dot zanella at linaro dot org>, "Maciej W . Rozycki" <macro at linux-mips dot org>, Faraz Shahbazker <fshahbazker at wavecomp dot com>
- Date: Wed, 21 Aug 2019 12:21:58 +0000
- Subject: [PATCH v5] Mips support for PT_GNU_STACK
- Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=wavecomp.com; dmarc=pass action=none header.from=wavecomp.com; dkim=pass header.d=wavecomp.com; arc=none
- Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=J8OB/3SG/tV+gFhRwj3fy2ZAwJoEl4Gxakfd9AtNWrs=; b=nZDM0/Tw7ZV/xV7W42Fz8I2nHlTSd7WhjbJ8pJv1nx2+xhKslMqH2CLsEjRKiZVBCfKekw0FZnkRvxMJOO2T25mk2LLFbhH3yOOXDSycV6gqaZvzEYgOp2dW0duJCjpBLl+xs17iIET1gz93UKSmfSyF7shzbFCi3zERVBt3lPHh0BlJFa21j7BFLJeXpXxrD4S8t5Dxih+Dxhf4bUyjb9NyDzN3REVuF4tWuDGnatU9BlRaWb2+5NOrfVlrVlybu7XRmiT/mtV2CNLhj6y5s0yOWxQ7NoTdrYRHOivYu6TyGvmJCiv7wUvKvpfn+uyrT+uuFZc49tSIzBs9Gnqdqw==
- Arc-seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Pz83BcKo/vejthyq3vONjImWWeD55H62CIAzyoa7QCoQmJHVL1zbyNxCb2ki0dLSlUCNqb+RHGnkrrG4FWP0T766BKwUYhCZLG8knt0JhXh3FJAC5zFAu31d6lA555Lsf095Q9L7bHDjLfAp6vJ9Y9rC9X1K2RRpaWCzR3W0UA8R1pdwlvEGQohS0dXMU4L9/rmMZilVOcMx4n9es7WQLdiUCLlOTdnVzP1Lw4e2SKoD3rtzliWNO3kCx+wF3ugCT4fI86imOU6cA2WfWHVaUfwwkr96i5y0IYXZrAfB9OjD9kbRtDbYXzbMUBIiRdWRtLMBdwji+wDrGaj8S+bDIQ==
From: "Dragan Mladjenovic" <dmladjenovic@wavecomp.com>
Hello everyone,
This is updated v4 version of the patch as per suggestion in [1].
Best regards,
Dragan
[1] https://sourceware.org/ml/libc-alpha/2019-08/msg00508.html
2019-08-21 Dragan Mladjenovic <dmladjenovic@wavecomp.com>
* sysdeps/unix/sysv/linux/mips/Makefile (test-xfail-check-execstack):
Move under mips-has-gnustack != yes.
(CFLAGS-.o*, ASFLAGS-.o*): New rules.
Apply -Wa,-execstack if mips-force-execstack == yes.
* sysdeps/unix/sysv/linux/mips/configure: Regenerated.
* sysdeps/unix/sysv/linux/mips/configure.ac (mips-force-execstack):
New var. Set to yes for hard-float builds with minimum_kernel < 4.8.0
or minimum_kernel not set at all.
(mips-has-gnustack): New var.
Use value of libc_cv_as_noexecstack if mips-force-execstack != yes,
otherwise set to no.
---
sysdeps/unix/sysv/linux/mips/Makefile | 21 +++++++++++++++-----
sysdeps/unix/sysv/linux/mips/configure.ac | 32 +++++++++++++++++++++++++++++++
2 files changed, 48 insertions(+), 5 deletions(-)
diff --git a/sysdeps/unix/sysv/linux/mips/Makefile b/sysdeps/unix/sysv/linux/mips/Makefile
index 8217f42..03044e7 100644
--- a/sysdeps/unix/sysv/linux/mips/Makefile
+++ b/sysdeps/unix/sysv/linux/mips/Makefile
@@ -63,14 +63,25 @@ sysdep-dl-routines += dl-static
sysdep_routines += dl-vdso
endif
-
-# Supporting non-executable stacks on MIPS requires changes to both
-# the Linux kernel and glibc. See
-# <https://sourceware.org/ml/libc-alpha/2016-01/msg00567.html> and
-# <https://sourceware.org/ml/libc-alpha/2016-01/msg00719.html>.
+# If the compiler doesn't use GNU.stack note,
+# this test is expected to fail.
+ifneq ($(mips-has-gnustack),yes)
test-xfail-check-execstack = yes
endif
+endif
ifeq ($(subdir),stdlib)
gen-as-const-headers += ucontext_i.sym
endif
+
+ifeq ($(mips-force-execstack),yes)
+CFLAGS-.o += -Wa,-execstack
+CFLAGS-.os += -Wa,-execstack
+CFLAGS-.op += -Wa,-execstack
+CFLAGS-.oS += -Wa,-execstack
+
+ASFLAGS-.o += -Wa,-execstack
+ASFLAGS-.os += -Wa,-execstack
+ASFLAGS-.op += -Wa,-execstack
+ASFLAGS-.oS += -Wa,-execstack
+endif
diff --git a/sysdeps/unix/sysv/linux/mips/configure.ac b/sysdeps/unix/sysv/linux/mips/configure.ac
index 9147aa4..3db1b32 100644
--- a/sysdeps/unix/sysv/linux/mips/configure.ac
+++ b/sysdeps/unix/sysv/linux/mips/configure.ac
@@ -134,3 +134,35 @@ if test -z "$arch_minimum_kernel"; then
arch_minimum_kernel=4.5.0
fi
fi
+
+# Check if we are supposed to run on kernels older than 4.8.0. If so,
+# force executable stack to avoid potential runtime problems with fpu
+# emulation.
+# NOTE: The check below assumes that in absence of user-provided minumum_kernel
+# we will default to arch_minimum_kernel which is currently less than 4.8.0 for
+# all known configurations. If this changes, the check must be updated.
+AC_CACHE_CHECK([whether the compiler must use executable stack],
+ libc_cv_mips_force_execstack, [dnl
+libc_cv_mips_force_execstack=no
+ if test $libc_mips_float = hard; then
+ if test -n "$minimum_kernel"; then
+ changequote(,)
+ min_version=$((`echo "$minimum_kernel.0.0.0" | sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\1 \* 65536 + \2 \* 256 + \3/'`))
+ changequote([,])
+ if test $min_version -lt 264192; then
+ libc_cv_mips_force_execstack=yes
+ fi
+ else
+ libc_cv_mips_force_execstack=yes
+ fi
+ fi])
+
+libc_mips_has_gnustack=$libc_cv_as_noexecstack
+
+if test $libc_cv_mips_force_execstack = yes; then
+ libc_mips_has_gnustack=no
+ AC_MSG_WARN([forcing executable stack for pre-4.8.0 Linux kernels])
+fi
+
+LIBC_CONFIG_VAR([mips-force-execstack],[${libc_cv_mips_force_execstack}])
+LIBC_CONFIG_VAR([mips-has-gnustack],[${libc_mips_has_gnustack}])
--
1.9.1