[v2,2/3,MIPS] Define DL_EXEC_STACK_OVERRIDE
Commit Message
For hard-float builds targeting minimum Linux kernel version lower than
4.8 DL_EXEC_STACK_OVERRIDE will request executable stack if it detects
that runtime kernel version is also lower than 4.8.
Build now detects if mips toolchain uses GNU.stack note and updates
the expected result of check-execstack accordingly.
* sysdeps/unix/sysv/linux/mips/Makefile
[$(subdir) == elf][$(mips-float) == hard]
(tests): Add tst-execstack-ovrd and tst-execstack-ovrd1.
(tests-static): Add tst-execstack-ovrd-static and
tst-execstack-ovrd1-static.
(LDFLAGS-tst-execstack-ovrd*, tst-execstack-ovrd*-ENV): New rules.
* sysdeps/unix/sysv/linux/mips/Makefile
[$(subdir) == elf][$(mips-has-gnustack) != yes]
(test-xfail-check-execstack): Move test-xfail-check-execstack here.
(test-xfail-tst-execstack-ovrd1): New xfail.
* sysdeps/unix/sysv/linux/mips/configure.ac
(mips-has-gnustack): New var. Set to value of libc_cv_as_noexecstack.
(mips-float): New var. Set to value of libc_mips_float.
* sysdeps/unix/sysv/linux/mips/configure: Regenerated.
* sysdeps/unix/sysv/linux/mips/ldsodefs.h
(__GNU_STACK_SAFE_KERNEL_VERSION): New. Define to 4.8.0.
(DL_EXEC_STACK_OVERRIDE): New. Check dl_osversion against previous define.
* sysdeps/unix/sysv/linux/mips/tst-execstack-ovrd-static.c: New file.
* sysdeps/unix/sysv/linux/mips/tst-execstack-ovrd.c: New file.
* sysdeps/unix/sysv/linux/mips/tst-execstack-ovrd1-static.c: New file.
* sysdeps/unix/sysv/linux/mips/tst-execstack-ovrd1.c: New file.
---
sysdeps/unix/sysv/linux/mips/Makefile | 26 ++++++++++++++++++----
sysdeps/unix/sysv/linux/mips/configure.ac | 3 +++
sysdeps/unix/sysv/linux/mips/ldsodefs.h | 11 +++++++++
.../sysv/linux/mips/tst-execstack-ovrd-static.c | 1 +
sysdeps/unix/sysv/linux/mips/tst-execstack-ovrd.c | 2 ++
.../sysv/linux/mips/tst-execstack-ovrd1-static.c | 1 +
sysdeps/unix/sysv/linux/mips/tst-execstack-ovrd1.c | 10 +++++++++
7 files changed, 50 insertions(+), 4 deletions(-)
create mode 100644 sysdeps/unix/sysv/linux/mips/tst-execstack-ovrd-static.c
create mode 100644 sysdeps/unix/sysv/linux/mips/tst-execstack-ovrd.c
create mode 100644 sysdeps/unix/sysv/linux/mips/tst-execstack-ovrd1-static.c
create mode 100644 sysdeps/unix/sysv/linux/mips/tst-execstack-ovrd1.c
@@ -64,11 +64,29 @@ 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>.
+ifeq ($(mips-float),hard)
+tests-static += tst-execstack-ovrd-static
+tests += tst-execstack-ovrd-static
+tests += tst-execstack-ovrd
+tests-static += tst-execstack-ovrd1-static
+tests += tst-execstack-ovrd1-static
+tests += tst-execstack-ovrd1
+LDFLAGS-tst-execstack-ovrd = -Wl,-z,noexecstack
+LDFLAGS-tst-execstack-ovrd-static = -Wl,-z,noexecstack
+LDFLAGS-tst-execstack-ovrd1 = -Wl,-z,noexecstack
+LDFLAGS-tst-execstack-ovrd1-static = -Wl,-z,noexecstack
+tst-execstack-ovrd-ENV = LD_ASSUME_KERNEL=4.5.0
+tst-execstack-ovrd-static-ENV = LD_ASSUME_KERNEL=4.5.0
+tst-execstack-ovrd1-ENV = LD_ASSUME_KERNEL=4.8.0
+tst-execstack-ovrd1-static-ENV = LD_ASSUME_KERNEL=4.8.0
+endif
+# If the compiler doesn't use GNU.stack note,
+# thease tests are expected to fail.
+ifneq ($(mips-has-gnustack),yes)
test-xfail-check-execstack = yes
+test-xfail-tst-execstack-ovrd1 = yes
+endif
+
endif
ifeq ($(subdir),stdlib)
@@ -118,6 +118,9 @@ fi
LIBC_CONFIG_VAR([default-abi],
[${libc_mips_abi}_${libc_mips_float}${libc_mips_nan}])
+LIBC_CONFIG_VAR([mips-has-gnustack],[${libc_cv_as_noexecstack}])
+LIBC_CONFIG_VAR([mips-float],[${libc_mips_float}])
+
case $machine in
mips/mips64/n64/*)
LIBC_SLIBDIR_RTLDDIR([lib64], [lib64])
@@ -37,4 +37,15 @@ extern void _dl_static_init (struct link_map *map);
|| (osabi == ELFOSABI_SYSV && ver < 4) \
|| (osabi == ELFOSABI_GNU && ver < LIBC_ABI_MAX))
+
+#define __GNU_STACK_SAFE_KERNEL_VERSION (0x040800)
+
+#ifdef __mips_hard_float
+# if (__LINUX_KERNEL_VERSION < __GNU_STACK_SAFE_KERNEL_VERSION)
+# undef DL_EXEC_STACK_OVERRIDE
+# define DL_EXEC_STACK_OVERRIDE \
+ ((GLRO(dl_osversion) < __GNU_STACK_SAFE_KERNEL_VERSION))
+# endif
+#endif
+
#endif /* ldsodefs.h */
new file mode 100644
@@ -0,0 +1 @@
+#include "tst-execstack-ovrd.c"
new file mode 100644
@@ -0,0 +1,2 @@
+#include "tst-execstack-prog.c"
+
new file mode 100644
@@ -0,0 +1 @@
+#include "tst-execstack-ovrd1.c"
new file mode 100644
@@ -0,0 +1,10 @@
+#include <signal.h>
+
+/* This test will fail (not produce a SIGSEGV) either because
+ DL_SYSDEP_OSCHECK detects that we are running on kernel older
+ than what we specify via LD_ASSUME_KERNEL or the execution
+ environment doesn't support NX semantics (no RIXI). */
+#define EXPECTED_SIGNAL SIGSEGV
+
+#include "tst-execstack-prog.c"
+