From: Joseph Myers Date: Tue, 26 Sep 2017 16:35:53 +0000 (+0100) Subject: Enable no-exec stacks for more targets using the Linux kernel. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=938b6f1e5d31c8c3ef4dd1dd4d6b65b3f53ad07d;p=gcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e7256d4b64c..916a33ad2e3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2017-09-26 Joseph Myers + + * 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 * graphite-scop-detection.c (scop_detection::build_scop_depth): Rewrite, diff --git a/gcc/config/microblaze/linux.h b/gcc/config/microblaze/linux.h index 41aa89866b0..d715f45f422 100644 --- a/gcc/config/microblaze/linux.h +++ b/gcc/config/microblaze/linux.h @@ -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 diff --git a/gcc/config/pa/pa-linux.h b/gcc/config/pa/pa-linux.h index a304c72fdba..811e697b8ed 100644 --- a/gcc/config/pa/pa-linux.h +++ b/gcc/config/pa/pa-linux.h @@ -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 diff --git a/gcc/config/pa/pa.c b/gcc/config/pa/pa.c index 2586f92d837..5e945fc2f3b 100644 --- a/gcc/config/pa/pa.c +++ b/gcc/config/pa/pa.c @@ -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 diff --git a/gcc/config/pa/pa.h b/gcc/config/pa/pa.h index fbfbe488363..cf95789b599 100644 --- a/gcc/config/pa/pa.h +++ b/gcc/config/pa/pa.h @@ -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 diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog index 90c07fe57f7..68401477f52 100644 --- a/libgcc/ChangeLog +++ b/libgcc/ChangeLog @@ -1,3 +1,13 @@ +2017-09-26 Joseph Myers + + * 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 * configure.ac: Add Check for HAVE_AS_AVX. diff --git a/libgcc/config/microblaze/crti.S b/libgcc/config/microblaze/crti.S index 61626e26929..7356163364a 100644 --- a/libgcc/config/microblaze/crti.S +++ b/libgcc/config/microblaze/crti.S @@ -24,6 +24,12 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see . */ +/* An executable stack is *not* required for these functions. */ +#ifdef __linux__ +.section .note.GNU-stack,"",%progbits +.previous +#endif + .section .init, "ax" .global __init diff --git a/libgcc/config/microblaze/crtn.S b/libgcc/config/microblaze/crtn.S index 3b9bf7ef52e..c784ed46ca3 100644 --- a/libgcc/config/microblaze/crtn.S +++ b/libgcc/config/microblaze/crtn.S @@ -24,6 +24,12 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see . */ +/* 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 diff --git a/libgcc/config/microblaze/divsi3.S b/libgcc/config/microblaze/divsi3.S index 42f9cb2276b..0cd14b37177 100644 --- a/libgcc/config/microblaze/divsi3.S +++ b/libgcc/config/microblaze/divsi3.S @@ -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 diff --git a/libgcc/config/microblaze/moddi3.S b/libgcc/config/microblaze/moddi3.S index bcea079476e..7d2a31d124e 100644 --- a/libgcc/config/microblaze/moddi3.S +++ b/libgcc/config/microblaze/moddi3.S @@ -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: diff --git a/libgcc/config/microblaze/modsi3.S b/libgcc/config/microblaze/modsi3.S index eb671a145af..118b18dbc71 100644 --- a/libgcc/config/microblaze/modsi3.S +++ b/libgcc/config/microblaze/modsi3.S @@ -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 diff --git a/libgcc/config/microblaze/muldi3_hard.S b/libgcc/config/microblaze/muldi3_hard.S index f2188c641f8..d9f18064c83 100644 --- a/libgcc/config/microblaze/muldi3_hard.S +++ b/libgcc/config/microblaze/muldi3_hard.S @@ -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: diff --git a/libgcc/config/microblaze/mulsi3.S b/libgcc/config/microblaze/mulsi3.S index f126b56413d..3d335225ce5 100644 --- a/libgcc/config/microblaze/mulsi3.S +++ b/libgcc/config/microblaze/mulsi3.S @@ -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 diff --git a/libgcc/config/microblaze/stack_overflow_exit.S b/libgcc/config/microblaze/stack_overflow_exit.S index 63319de17ed..5f6be94e07a 100644 --- a/libgcc/config/microblaze/stack_overflow_exit.S +++ b/libgcc/config/microblaze/stack_overflow_exit.S @@ -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 diff --git a/libgcc/config/microblaze/udivsi3.S b/libgcc/config/microblaze/udivsi3.S index 2e08fb20333..f01c027f5d6 100644 --- a/libgcc/config/microblaze/udivsi3.S +++ b/libgcc/config/microblaze/udivsi3.S @@ -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 diff --git a/libgcc/config/microblaze/umodsi3.S b/libgcc/config/microblaze/umodsi3.S index b230a8cf807..a91eae75575 100644 --- a/libgcc/config/microblaze/umodsi3.S +++ b/libgcc/config/microblaze/umodsi3.S @@ -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 diff --git a/libgcc/config/pa/milli64.S b/libgcc/config/pa/milli64.S index cfd4d83329b..4690dd13aca 100644 --- a/libgcc/config/pa/milli64.S +++ b/libgcc/config/pa/milli64.S @@ -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 . */ +/* 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