Commit 938b6f1e by Joseph Myers Committed by Joseph Myers

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 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
parent ca617fd2
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> 2017-09-26 Richard Biener <rguenther@suse.de>
* graphite-scop-detection.c (scop_detection::build_scop_depth): Rewrite, * graphite-scop-detection.c (scop_detection::build_scop_depth): Rewrite,
...@@ -57,3 +57,5 @@ ...@@ -57,3 +57,5 @@
/* For the microblaze-*-linux* subtarget. */ /* For the microblaze-*-linux* subtarget. */
#undef TARGET_OS_CPP_BUILTINS #undef TARGET_OS_CPP_BUILTINS
#define TARGET_OS_CPP_BUILTINS() GNU_USER_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
...@@ -141,3 +141,6 @@ along with GCC; see the file COPYING3. If not see ...@@ -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_swaphi 1
#define HAVE_sync_compare_and_swapsi 1 #define HAVE_sync_compare_and_swapsi 1
#define HAVE_sync_compare_and_swapdi 1 #define HAVE_sync_compare_and_swapdi 1
#undef NEED_INDICATE_EXEC_STACK
#define NEED_INDICATE_EXEC_STACK 1
...@@ -159,9 +159,7 @@ static void pa_hpux64_gas_file_start (void) ATTRIBUTE_UNUSED; ...@@ -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 pa_hpux64_hpas_file_start (void) ATTRIBUTE_UNUSED;
static void output_deferred_plabels (void); static void output_deferred_plabels (void);
static void output_deferred_profile_counters (void) ATTRIBUTE_UNUSED; static void output_deferred_profile_counters (void) ATTRIBUTE_UNUSED;
#ifdef ASM_OUTPUT_EXTERNAL_REAL static void pa_file_end (void);
static void pa_hpux_file_end (void);
#endif
static void pa_init_libfuncs (void); static void pa_init_libfuncs (void);
static rtx pa_struct_value_rtx (tree, int); static rtx pa_struct_value_rtx (tree, int);
static bool pa_pass_by_reference (cumulative_args_t, machine_mode, static bool pa_pass_by_reference (cumulative_args_t, machine_mode,
...@@ -301,11 +299,7 @@ static size_t n_deferred_plabels = 0; ...@@ -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 #define TARGET_ASM_CAN_OUTPUT_MI_THUNK default_can_output_mi_thunk_no_vcall
#undef TARGET_ASM_FILE_END #undef TARGET_ASM_FILE_END
#ifdef ASM_OUTPUT_EXTERNAL_REAL #define TARGET_ASM_FILE_END pa_file_end
#define TARGET_ASM_FILE_END pa_hpux_file_end
#else
#define TARGET_ASM_FILE_END output_deferred_plabels
#endif
#undef TARGET_ASM_RELOC_RW_MASK #undef TARGET_ASM_RELOC_RW_MASK
#define TARGET_ASM_RELOC_RW_MASK pa_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) ...@@ -9979,22 +9973,26 @@ pa_hpux_asm_output_external (FILE *file, tree decl, const char *name)
extern_symbol p = {decl, name}; extern_symbol p = {decl, name};
vec_safe_push (extern_symbols, p); vec_safe_push (extern_symbols, p);
} }
#endif
/* Output text required at the end of an assembler file. /* Output text required at the end of an assembler file.
This includes deferred plabels and .import directives for This includes deferred plabels and .import directives for
all external symbols that were actually referenced. */ all external symbols that were actually referenced. */
static void static void
pa_hpux_file_end (void) pa_file_end (void)
{ {
#ifdef ASM_OUTPUT_EXTERNAL_REAL
unsigned int i; unsigned int i;
extern_symbol *p; extern_symbol *p;
if (!NO_DEFERRED_PROFILE_COUNTERS) if (!NO_DEFERRED_PROFILE_COUNTERS)
output_deferred_profile_counters (); output_deferred_profile_counters ();
#endif
output_deferred_plabels (); output_deferred_plabels ();
#ifdef ASM_OUTPUT_EXTERNAL_REAL
for (i = 0; vec_safe_iterate (extern_symbols, i, &p); i++) for (i = 0; vec_safe_iterate (extern_symbols, i, &p); i++)
{ {
tree decl = p->decl; tree decl = p->decl;
...@@ -10005,9 +10003,12 @@ pa_hpux_file_end (void) ...@@ -10005,9 +10003,12 @@ pa_hpux_file_end (void)
} }
vec_free (extern_symbols); vec_free (extern_symbols);
}
#endif #endif
if (NEED_INDICATE_EXEC_STACK)
file_end_indicate_exec_stack ();
}
/* Implement TARGET_CAN_CHANGE_MODE_CLASS. */ /* Implement TARGET_CAN_CHANGE_MODE_CLASS. */
static bool static bool
......
...@@ -1306,3 +1306,5 @@ do { \ ...@@ -1306,3 +1306,5 @@ do { \
seven and four instructions, respectively. */ seven and four instructions, respectively. */
#define MAX_PCREL17F_OFFSET \ #define MAX_PCREL17F_OFFSET \
(flag_pic ? (TARGET_HPUX ? 198164 : 221312) : 240000) (flag_pic ? (TARGET_HPUX ? 198164 : 221312) : 240000)
#define NEED_INDICATE_EXEC_STACK 0
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> 2017-09-23 Daniel Santos <daniel.santos@pobox.com>
* configure.ac: Add Check for HAVE_AS_AVX. * configure.ac: Add Check for HAVE_AS_AVX.
......
...@@ -24,6 +24,12 @@ ...@@ -24,6 +24,12 @@
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
<http://www.gnu.org/licenses/>. */ <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" .section .init, "ax"
.global __init .global __init
......
...@@ -24,6 +24,12 @@ ...@@ -24,6 +24,12 @@
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
<http://www.gnu.org/licenses/>. */ <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" .section .init, "ax"
lw r15, r0, r1 lw r15, r0, r1
rtsd r15, 8 rtsd r15, 8
......
...@@ -32,6 +32,12 @@ ...@@ -32,6 +32,12 @@
# #
####################################### #######################################
/* An executable stack is *not* required for these functions. */
#ifdef __linux__
.section .note.GNU-stack,"",%progbits
.previous
#endif
.globl __divsi3 .globl __divsi3
.ent __divsi3 .ent __divsi3
.type __divsi3,@function .type __divsi3,@function
......
...@@ -30,6 +30,12 @@ ...@@ -30,6 +30,12 @@
####################################### #######################################
/* An executable stack is *not* required for these functions. */
#ifdef __linux__
.section .note.GNU-stack,"",%progbits
.previous
#endif
.globl __moddi3 .globl __moddi3
.ent __moddi3 .ent __moddi3
__moddi3: __moddi3:
......
...@@ -32,6 +32,12 @@ ...@@ -32,6 +32,12 @@
# #
####################################### #######################################
/* An executable stack is *not* required for these functions. */
#ifdef __linux__
.section .note.GNU-stack,"",%progbits
.previous
#endif
.globl __modsi3 .globl __modsi3
.ent __modsi3 .ent __modsi3
.type __modsi3,@function .type __modsi3,@function
......
...@@ -47,6 +47,12 @@ ...@@ -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 .globl muldi3_hardproc
.ent muldi3_hardproc .ent muldi3_hardproc
muldi3_hardproc: muldi3_hardproc:
......
...@@ -32,6 +32,12 @@ ...@@ -32,6 +32,12 @@
# #
####################################### #######################################
/* An executable stack is *not* required for these functions. */
#ifdef __linux__
.section .note.GNU-stack,"",%progbits
.previous
#endif
.globl __mulsi3 .globl __mulsi3
.ent __mulsi3 .ent __mulsi3
.type __mulsi3,@function .type __mulsi3,@function
......
...@@ -33,6 +33,12 @@ ...@@ -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 .globl _stack_overflow_error
.data .data
.align 2 .align 2
......
...@@ -32,6 +32,12 @@ ...@@ -32,6 +32,12 @@
# #
####################################### #######################################
/* An executable stack is *not* required for these functions. */
#ifdef __linux__
.section .note.GNU-stack,"",%progbits
.previous
#endif
.globl __udivsi3 .globl __udivsi3
.ent __udivsi3 .ent __udivsi3
.type __udivsi3,@function .type __udivsi3,@function
......
...@@ -32,6 +32,12 @@ ...@@ -32,6 +32,12 @@
# #
####################################### #######################################
/* An executable stack is *not* required for these functions. */
#ifdef __linux__
.section .note.GNU-stack,"",%progbits
.previous
#endif
.globl __umodsi3 .globl __umodsi3
.ent __umodsi3 .ent __umodsi3
.type __umodsi3,@function .type __umodsi3,@function
......
...@@ -25,6 +25,12 @@ a copy of the GCC Runtime Library Exception along with this program; ...@@ -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 see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
<http://www.gnu.org/licenses/>. */ <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 #ifdef pa64
.level 2.0w .level 2.0w
#endif #endif
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment