Enable no-exec stacks for more targets using the Linux kernel.
authorJoseph Myers <joseph@codesourcery.com>
Tue, 26 Sep 2017 16:35:53 +0000 (17:35 +0100)
committerJoseph Myers <jsm28@gcc.gnu.org>
Tue, 26 Sep 2017 16:35:53 +0000 (17:35 +0100)
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 and microblaze.  Those
configurations default to executable stacks in the Linux kernel
because of VM_DATA_DEFAULT_FLAGS definitions including VM_EXEC
(VM_DATA_DEFAULT_FLAGS being the default definition of
VM_STACK_DEFAULT_FLAGS).

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.)

gcc:
* 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:
* 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.

From-SVN: r253204

17 files changed:
gcc/ChangeLog
gcc/config/microblaze/linux.h
gcc/config/pa/pa-linux.h
gcc/config/pa/pa.c
gcc/config/pa/pa.h
libgcc/ChangeLog
libgcc/config/microblaze/crti.S
libgcc/config/microblaze/crtn.S
libgcc/config/microblaze/divsi3.S
libgcc/config/microblaze/moddi3.S
libgcc/config/microblaze/modsi3.S
libgcc/config/microblaze/muldi3_hard.S
libgcc/config/microblaze/mulsi3.S
libgcc/config/microblaze/stack_overflow_exit.S
libgcc/config/microblaze/udivsi3.S
libgcc/config/microblaze/umodsi3.S
libgcc/config/pa/milli64.S

index e7256d4b64c40607942f275e82543129987d5212..916a33ad2e3a940ffd4e65afd41ad6d5ef4c1548 100644 (file)
@@ -1,3 +1,14 @@
+2017-09-26  Joseph Myers  <joseph@codesourcery.com>
+
+       * 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.
+
 2017-09-26  Richard Biener  <rguenther@suse.de>
 
        * graphite-scop-detection.c (scop_detection::build_scop_depth): Rewrite,
index 41aa89866b0dd756526b46a538530b4fb6c51bfb..d715f45f4228dad8cecbda4055590988d0d61cd9 100644 (file)
@@ -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 a304c72fdbacd5a746197f235339196e521ab81a..811e697b8ed4365532c8ec1bdc3ba40633724d8e 100644 (file)
@@ -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 2586f92d837aa5bd99ddd77d401f183313497a88..5e945fc2f3b3852d40db02891808cee5a87a6ca4 100644 (file)
@@ -159,9 +159,7 @@ static void pa_hpux64_gas_file_start (void) ATTRIBUTE_UNUSED;
 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
@@ -9979,22 +9973,26 @@ pa_hpux_asm_output_external (FILE *file, tree decl, const char *name)
   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
    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;
@@ -10005,9 +10003,12 @@ pa_hpux_file_end (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 fbfbe488363100e8e951bd7d11227ccda6a890c0..cf95789b59941f84f02685ed34ae7e62bc7a5e85 100644 (file)
@@ -1306,3 +1306,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 90c07fe57f7e023bf731a2494529adf6d81ed47f..68401477f52b67cc39ae363c093db5e716851f1f 100644 (file)
@@ -1,3 +1,13 @@
+2017-09-26  Joseph Myers  <joseph@codesourcery.com>
+
+       * 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.
+
 2017-09-23  Daniel Santos  <daniel.santos@pobox.com>
 
        * configure.ac: Add Check for HAVE_AS_AVX.
index 61626e2692936b006553001bece282eb64071a1b..7356163364a70874e7e696ef16ab7331d4ca5dec 100644 (file)
    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 3b9bf7ef52e3508382d0612b89008d60ab1ca12f..c784ed46ca3b17b06ed12ff9c6a9c618c34c93c9 100644 (file)
    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 42f9cb2276b27f2a103e2767037bf6089a06c434..0cd14b37177340a4a812f0151f0e2a51ec1619d3 100644 (file)
 # 
 #######################################
        
+/* 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 bcea079476e4ac8acc72bad21ee8e1b8203ff865..7d2a31d124e1938821788bfb4e430bc3ee87e231 100644 (file)
 #######################################
 
 
+/* An executable stack is *not* required for these functions.  */
+#ifdef __linux__
+.section .note.GNU-stack,"",%progbits
+.previous
+#endif
+
        .globl  __moddi3
        .ent    __moddi3
 __moddi3:
index eb671a145af3cda5449666d47d924e17b5025adb..118b18dbc71e7bc95f83f0abe02098fd532f998f 100644 (file)
 # 
 #######################################
 
+/* 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 f2188c641f88b42e44fc3a5cee2796095c63a325..d9f18064c835e879a9fb8ac33c576dc8daaeb461 100644 (file)
 #
 #######################################
 
+/* 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 f126b56413d714dc720eb593546000cc2819e329..3d335225ce5d9a044756002a69203d9541427653 100644 (file)
 # 
 #######################################
 
+/* 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 63319de17edaf39b22952ac3dadaee1e8e51184a..5f6be94e07a0ea2b98eb94ae106b588639b37016 100644 (file)
 # 
 #######################################
 
+/* 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 2e08fb2033397e654d73ef9acb34b67543dad923..f01c027f5d67ac6040bff52226ce5acee78f1e25 100644 (file)
 # 
 #######################################
        
+/* 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 b230a8cf8070483330bc5ee97e5007c26fa90f03..a91eae7557533f7153f7f8aa7b23b0e0666d39b7 100644 (file)
 # 
 #######################################
        
+/* 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 cfd4d83329b979b0f50a552a899a31cf3d65539e..4690dd13aca2d12848a9f62d40ea691b05230dc8 100644 (file)
@@ -25,6 +25,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/>.  */
 
+/* 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