This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Enable no-exec stacks for more targets using the Linux kernel


Building glibc for many different configurations and running the
compilation parts of the testsuite runs into failures of the
elf/check-execstack test for hppa, ia64 and microblaze.

This fails because those configurations are not generating
.note.GNU-stack sections to indicate that programs do not need an
executable stack.  This patch fixes GCC to generate those sections on
those architectures (when configured for a target using the Linux
kernel), as it does on other architectures, together with adding that
section to libgcc .S sources, with the same code as used on other
architectures (or a variant using "#ifdef __linux__" instead of the
usual "#if defined(__ELF__) && defined(__linux__)" for microblaze, as
that configuration doesn't use elfos.h and so doesn't define __ELF__).

This suffices to eliminate that glibc test failure.  (For hppa, the
compilation parts of the glibc testsuite still fail because of the
separate elf/check-textrel failure.)  Now, there are some possible
reasons why a change such as this could be incorrect, and I don't know
enough about the architectures in question to rule them out: (a) if
the hardware architecture does not actually support the page
permissions required for no-exec stacks, (b) if, as on MIPS,
additional architecture-specific work elsewhere in the toolchain or
kernel would be needed for no-exec stacks to work, or (c) if in fact
one of the libgcc functions I've marked for no-exec stacks somehow
needs an executable stack.

Thus, I'd like the architecture maintainers to advise on whether any
such issues apply for their architecture.  If they do, that will
provide the information needed for a comment on XFAILing the test in
glibc.  If no such reasons apply for the patch to be problematic, I'd
like it reviewed for each of those architectures (you may wish to do
such testing as you see fit; I have *not* run any GCC tests with this
patch, just tested building glibc and running the compilation tests
with build-many-glibcs.py).

gcc:
2017-09-18  Joseph Myers  <joseph@codesourcery.com>

	* config/ia64/linux.h (TARGET_ASM_FILE_END): New macro.
	* config/microblaze/linux.h (TARGET_ASM_FILE_END): Likewise.
	* config/pa/pa.h (NEED_INDICATE_EXEC_STACK): Likewise.
	* config/pa/pa-linux.h (NEED_INDICATE_EXEC_STACK): Likewise.
	* config/pa/pa.c (pa_hpux_file_end): Rename to pa_file_end.
	Define unconditionally, with [ASM_OUTPUT_EXTERNAL_REAL]
	conditionals inside the function instead of around it.  Call
	file_end_indicate_exec_stack if NEED_INDICATE_EXEC_STACK.
	(TARGET_ASM_FILE_END): Define unconditionally to pa_file_end.

libgcc:
2017-09-18  Joseph Myers  <joseph@codesourcery.com>

	* config/ia64/crtbegin.S, config/ia64/crtend.S,
	config/ia64/crti.S, config/ia64/crtn.S, config/ia64/lib1funcs.S,
	config/microblaze/crti.S, config/microblaze/crtn.S,
	config/microblaze/divsi3.S, config/microblaze/moddi3.S,
	config/microblaze/modsi3.S, config/microblaze/muldi3_hard.S,
	config/microblaze/mulsi3.S,
	config/microblaze/stack_overflow_exit.S,
	config/microblaze/udivsi3.S, config/microblaze/umodsi3.S,
	config/pa/milli64.S: Add .note.GNU-stack section.

Index: gcc/config/ia64/linux.h
===================================================================
--- gcc/config/ia64/linux.h	(revision 252935)
+++ gcc/config/ia64/linux.h	(working copy)
@@ -81,3 +81,5 @@ do {						\
 
 /* Define this to be nonzero if static stack checking is supported.  */
 #define STACK_CHECK_STATIC_BUILTIN 1
+
+#define TARGET_ASM_FILE_END file_end_indicate_exec_stack
Index: gcc/config/microblaze/linux.h
===================================================================
--- gcc/config/microblaze/linux.h	(revision 252935)
+++ gcc/config/microblaze/linux.h	(working copy)
@@ -57,3 +57,5 @@
 /* For the microblaze-*-linux* subtarget.  */
 #undef TARGET_OS_CPP_BUILTINS
 #define TARGET_OS_CPP_BUILTINS() GNU_USER_TARGET_OS_CPP_BUILTINS()
+
+#define TARGET_ASM_FILE_END file_end_indicate_exec_stack
Index: gcc/config/pa/pa-linux.h
===================================================================
--- gcc/config/pa/pa-linux.h	(revision 252935)
+++ gcc/config/pa/pa-linux.h	(working copy)
@@ -141,3 +141,6 @@ along with GCC; see the file COPYING3.  If not see
 #define HAVE_sync_compare_and_swaphi 1
 #define HAVE_sync_compare_and_swapsi 1
 #define HAVE_sync_compare_and_swapdi 1
+
+#undef NEED_INDICATE_EXEC_STACK
+#define NEED_INDICATE_EXEC_STACK 1
Index: gcc/config/pa/pa.c
===================================================================
--- gcc/config/pa/pa.c	(revision 252935)
+++ gcc/config/pa/pa.c	(working copy)
@@ -159,9 +159,7 @@ static void pa_hpux64_gas_file_start (void) ATTRIB
 static void pa_hpux64_hpas_file_start (void) ATTRIBUTE_UNUSED;
 static void output_deferred_plabels (void);
 static void output_deferred_profile_counters (void) ATTRIBUTE_UNUSED;
-#ifdef ASM_OUTPUT_EXTERNAL_REAL
-static void pa_hpux_file_end (void);
-#endif
+static void pa_file_end (void);
 static void pa_init_libfuncs (void);
 static rtx pa_struct_value_rtx (tree, int);
 static bool pa_pass_by_reference (cumulative_args_t, machine_mode,
@@ -301,11 +299,7 @@ static size_t n_deferred_plabels = 0;
 #define TARGET_ASM_CAN_OUTPUT_MI_THUNK default_can_output_mi_thunk_no_vcall
 
 #undef TARGET_ASM_FILE_END
-#ifdef ASM_OUTPUT_EXTERNAL_REAL
-#define TARGET_ASM_FILE_END pa_hpux_file_end
-#else
-#define TARGET_ASM_FILE_END output_deferred_plabels
-#endif
+#define TARGET_ASM_FILE_END pa_file_end
 
 #undef TARGET_ASM_RELOC_RW_MASK
 #define TARGET_ASM_RELOC_RW_MASK pa_reloc_rw_mask
@@ -9976,6 +9970,7 @@ pa_hpux_asm_output_external (FILE *file, tree decl
   extern_symbol p = {decl, name};
   vec_safe_push (extern_symbols, p);
 }
+#endif
 
 /* Output text required at the end of an assembler file.
    This includes deferred plabels and .import directives for
@@ -9982,16 +9977,19 @@ pa_hpux_asm_output_external (FILE *file, tree decl
    all external symbols that were actually referenced.  */
 
 static void
-pa_hpux_file_end (void)
+pa_file_end (void)
 {
+#ifdef ASM_OUTPUT_EXTERNAL_REAL
   unsigned int i;
   extern_symbol *p;
 
   if (!NO_DEFERRED_PROFILE_COUNTERS)
     output_deferred_profile_counters ();
+#endif
 
   output_deferred_plabels ();
 
+#ifdef ASM_OUTPUT_EXTERNAL_REAL
   for (i = 0; vec_safe_iterate (extern_symbols, i, &p); i++)
     {
       tree decl = p->decl;
@@ -10002,9 +10000,12 @@ static void
     }
 
   vec_free (extern_symbols);
-}
 #endif
 
+  if (NEED_INDICATE_EXEC_STACK)
+    file_end_indicate_exec_stack ();
+}
+
 /* Implement TARGET_CAN_CHANGE_MODE_CLASS.  */
 
 static bool
Index: gcc/config/pa/pa.h
===================================================================
--- gcc/config/pa/pa.h	(revision 252935)
+++ gcc/config/pa/pa.h	(working copy)
@@ -1311,3 +1311,5 @@ do {									     \
    seven and four instructions, respectively.  */  
 #define MAX_PCREL17F_OFFSET \
   (flag_pic ? (TARGET_HPUX ? 198164 : 221312) : 240000)
+
+#define NEED_INDICATE_EXEC_STACK 0
Index: libgcc/config/ia64/crtbegin.S
===================================================================
--- libgcc/config/ia64/crtbegin.S	(revision 252935)
+++ libgcc/config/ia64/crtbegin.S	(working copy)
@@ -24,6 +24,12 @@
 
 #include "auto-host.h"
 
+/* An executable stack is *not* required for these functions.  */
+#if defined(__ELF__) && defined(__linux__)
+.section .note.GNU-stack,"",%progbits
+.previous
+#endif
+
 .section .ctors,"aw","progbits"
 	.align	8
 __CTOR_LIST__:
Index: libgcc/config/ia64/crtend.S
===================================================================
--- libgcc/config/ia64/crtend.S	(revision 252935)
+++ libgcc/config/ia64/crtend.S	(working copy)
@@ -24,6 +24,12 @@
 
 #include "auto-host.h"
 
+/* An executable stack is *not* required for these functions.  */
+#if defined(__ELF__) && defined(__linux__)
+.section .note.GNU-stack,"",%progbits
+.previous
+#endif
+
 .section .ctors,"aw","progbits"
 	.align	8
 __CTOR_END__:
Index: libgcc/config/ia64/crti.S
===================================================================
--- libgcc/config/ia64/crti.S	(revision 252935)
+++ libgcc/config/ia64/crti.S	(working copy)
@@ -24,6 +24,12 @@
 # .init sections.  Users may put any desired instructions in those
 # sections.
 
+/* An executable stack is *not* required for these functions.  */
+#if defined(__ELF__) && defined(__linux__)
+.section .note.GNU-stack,"",%progbits
+.previous
+#endif
+
 	.section	".init"
 	.align 16
 	.global	_init
Index: libgcc/config/ia64/crtn.S
===================================================================
--- libgcc/config/ia64/crtn.S	(revision 252935)
+++ libgcc/config/ia64/crtn.S	(working copy)
@@ -24,6 +24,12 @@
 # fact return.  Users may put any desired instructions in those sections.
 # This file is the last thing linked into any executable.
 
+/* An executable stack is *not* required for these functions.  */
+#if defined(__ELF__) && defined(__linux__)
+.section .note.GNU-stack,"",%progbits
+.previous
+#endif
+
 	.section	".init"
 	;;
 	mov	ar.pfs = r34
Index: libgcc/config/ia64/lib1funcs.S
===================================================================
--- libgcc/config/ia64/lib1funcs.S	(revision 252935)
+++ libgcc/config/ia64/lib1funcs.S	(working copy)
@@ -22,6 +22,12 @@
    see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
    <http://www.gnu.org/licenses/>.  */
 
+/* An executable stack is *not* required for these functions.  */
+#if defined(__ELF__) && defined(__linux__)
+.section .note.GNU-stack,"",%progbits
+.previous
+#endif
+
 #ifdef L__divxf3
 // Compute a 80-bit IEEE double-extended quotient.
 //
Index: libgcc/config/microblaze/crti.S
===================================================================
--- libgcc/config/microblaze/crti.S	(revision 252935)
+++ libgcc/config/microblaze/crti.S	(working copy)
@@ -24,6 +24,12 @@
    see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
    <http://www.gnu.org/licenses/>.  */
 
+/* An executable stack is *not* required for these functions.  */
+#ifdef __linux__
+.section .note.GNU-stack,"",%progbits
+.previous
+#endif
+
     .section .init, "ax"
     .global __init
 
Index: libgcc/config/microblaze/crtn.S
===================================================================
--- libgcc/config/microblaze/crtn.S	(revision 252935)
+++ libgcc/config/microblaze/crtn.S	(working copy)
@@ -24,6 +24,12 @@
    see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
    <http://www.gnu.org/licenses/>.  */
 
+/* An executable stack is *not* required for these functions.  */
+#ifdef __linux__
+.section .note.GNU-stack,"",%progbits
+.previous
+#endif
+
     .section .init, "ax"
     lw      r15, r0, r1
     rtsd    r15, 8 
Index: libgcc/config/microblaze/divsi3.S
===================================================================
--- libgcc/config/microblaze/divsi3.S	(revision 252935)
+++ libgcc/config/microblaze/divsi3.S	(working copy)
@@ -32,6 +32,12 @@
 # 
 #######################################
 	
+/* An executable stack is *not* required for these functions.  */
+#ifdef __linux__
+.section .note.GNU-stack,"",%progbits
+.previous
+#endif
+
 	.globl	__divsi3
 	.ent	__divsi3
 	.type	__divsi3,@function
Index: libgcc/config/microblaze/moddi3.S
===================================================================
--- libgcc/config/microblaze/moddi3.S	(revision 252935)
+++ libgcc/config/microblaze/moddi3.S	(working copy)
@@ -30,6 +30,12 @@
 #######################################
 
 
+/* An executable stack is *not* required for these functions.  */
+#ifdef __linux__
+.section .note.GNU-stack,"",%progbits
+.previous
+#endif
+
 	.globl	__moddi3
 	.ent	__moddi3
 __moddi3:
Index: libgcc/config/microblaze/modsi3.S
===================================================================
--- libgcc/config/microblaze/modsi3.S	(revision 252935)
+++ libgcc/config/microblaze/modsi3.S	(working copy)
@@ -32,6 +32,12 @@
 # 
 #######################################
 
+/* An executable stack is *not* required for these functions.  */
+#ifdef __linux__
+.section .note.GNU-stack,"",%progbits
+.previous
+#endif
+
 	.globl	__modsi3
 	.ent	__modsi3
 	.type	__modsi3,@function
Index: libgcc/config/microblaze/muldi3_hard.S
===================================================================
--- libgcc/config/microblaze/muldi3_hard.S	(revision 252935)
+++ libgcc/config/microblaze/muldi3_hard.S	(working copy)
@@ -47,6 +47,12 @@
 #
 #######################################
 
+/* An executable stack is *not* required for these functions.  */
+#ifdef __linux__
+.section .note.GNU-stack,"",%progbits
+.previous
+#endif
+
 	.globl	muldi3_hardproc
 	.ent	muldi3_hardproc
 muldi3_hardproc:
Index: libgcc/config/microblaze/mulsi3.S
===================================================================
--- libgcc/config/microblaze/mulsi3.S	(revision 252935)
+++ libgcc/config/microblaze/mulsi3.S	(working copy)
@@ -32,6 +32,12 @@
 # 
 #######################################
 
+/* An executable stack is *not* required for these functions.  */
+#ifdef __linux__
+.section .note.GNU-stack,"",%progbits
+.previous
+#endif
+
 	.globl	__mulsi3
 	.ent	__mulsi3
 	.type	__mulsi3,@function
Index: libgcc/config/microblaze/stack_overflow_exit.S
===================================================================
--- libgcc/config/microblaze/stack_overflow_exit.S	(revision 252935)
+++ libgcc/config/microblaze/stack_overflow_exit.S	(working copy)
@@ -33,6 +33,12 @@
 # 
 #######################################
 
+/* An executable stack is *not* required for these functions.  */
+#ifdef __linux__
+.section .note.GNU-stack,"",%progbits
+.previous
+#endif
+
 	.globl	_stack_overflow_error
 	.data
 	.align	2
Index: libgcc/config/microblaze/udivsi3.S
===================================================================
--- libgcc/config/microblaze/udivsi3.S	(revision 252935)
+++ libgcc/config/microblaze/udivsi3.S	(working copy)
@@ -32,6 +32,12 @@
 # 
 #######################################
 	
+/* An executable stack is *not* required for these functions.  */
+#ifdef __linux__
+.section .note.GNU-stack,"",%progbits
+.previous
+#endif
+
 	.globl	__udivsi3
 	.ent	__udivsi3
 	.type	__udivsi3,@function
Index: libgcc/config/microblaze/umodsi3.S
===================================================================
--- libgcc/config/microblaze/umodsi3.S	(revision 252935)
+++ libgcc/config/microblaze/umodsi3.S	(working copy)
@@ -32,6 +32,12 @@
 # 
 #######################################
 	
+/* An executable stack is *not* required for these functions.  */
+#ifdef __linux__
+.section .note.GNU-stack,"",%progbits
+.previous
+#endif
+
 	.globl	__umodsi3
 	.ent	__umodsi3
 	.type	__umodsi3,@function
Index: libgcc/config/pa/milli64.S
===================================================================
--- libgcc/config/pa/milli64.S	(revision 252935)
+++ libgcc/config/pa/milli64.S	(working copy)
@@ -25,6 +25,12 @@ a copy of the GCC Runtime Library Exception along
 see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 <http://www.gnu.org/licenses/>.  */
 
+/* An executable stack is *not* required for these functions.  */
+#if defined(__ELF__) && defined(__linux__)
+.section .note.GNU-stack,"",%progbits
+.previous
+#endif
+
 #ifdef pa64
         .level  2.0w
 #endif

-- 
Joseph S. Myers
joseph@codesourcery.com


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]