From 68d55fe3f008459534e270cc7b54f122846466f9 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Wed, 4 Jun 2003 16:54:45 +0000 Subject: [PATCH] * as.c (show_usage): Document --execstack and --noexecstack. (parse_args): Add --execstack and --noexecstack. (main): Create .note.GNU-stack section if --execstack or --noexecstack was given on comand line, set its SHF_EXECINSTR bit. * as.h (flag_execstack, flag_noexecstack): New. --- gas/ChangeLog | 8 ++++++++ gas/as.c | 39 ++++++++++++++++++++++++++++++++++++++- gas/as.h | 6 ++++++ 3 files changed, 52 insertions(+), 1 deletion(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index f4bd381..fd23b8f 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,11 @@ +2003-06-04 Jakub Jelinek + + * as.c (show_usage): Document --execstack and --noexecstack. + (parse_args): Add --execstack and --noexecstack. + (main): Create .note.GNU-stack section if --execstack or + --noexecstack was given on comand line, set its SHF_EXECINSTR bit. + * as.h (flag_execstack, flag_noexecstack): New. + 2003-06-03 Chris Demetriou * config/tc-mips.c: (OPTION_ARCH_BASE, OPTION_ASE_BASE) diff --git a/gas/as.c b/gas/as.c index 27a0089..5ff1403 100644 --- a/gas/as.c +++ b/gas/as.c @@ -268,6 +268,12 @@ Options:\n\ emulate output (default %s)\n"), def_em); } #endif +#if defined BFD_ASSEMBLER && (defined OBJ_ELF || defined OBJ_MAYBE_ELF) + fprintf (stream, _("\ + --execstack require executable stack for this object\n")); + fprintf (stream, _("\ + --noexecstack don't require executable stack for this object\n")); +#endif fprintf (stream, _("\ -f skip whitespace and comment preprocessing\n")); fprintf (stream, _("\ @@ -437,7 +443,13 @@ parse_args (pargc, pargv) {"warn", no_argument, NULL, OPTION_WARN}, #define OPTION_TARGET_HELP (OPTION_STD_BASE + 19) {"target-help", no_argument, NULL, OPTION_TARGET_HELP}, -#define OPTION_WARN_FATAL (OPTION_STD_BASE + 20) +#if defined BFD_ASSEMBLER && (defined OBJ_ELF || defined OBJ_MAYBE_ELF) +#define OPTION_EXECSTACK (OPTION_STD_BASE + 20) + {"execstack", no_argument, NULL, OPTION_EXECSTACK}, +#define OPTION_NOEXECSTACK (OPTION_STD_BASE + 21) + {"noexecstack", no_argument, NULL, OPTION_NOEXECSTACK}, +#endif +#define OPTION_WARN_FATAL (OPTION_STD_BASE + 22) {"fatal-warnings", no_argument, NULL, OPTION_WARN_FATAL} /* When you add options here, check that they do not collide with OPTION_MD_BASE. See as.h. */ @@ -698,6 +710,18 @@ the GNU General Public License. This program has absolutely no warranty.\n")); flag_fatal_warnings = 1; break; +#if defined BFD_ASSEMBLER && (defined OBJ_ELF || defined OBJ_MAYBE_ELF) + case OPTION_EXECSTACK: + flag_execstack = 1; + flag_noexecstack = 0; + break; + + case OPTION_NOEXECSTACK: + flag_noexecstack = 1; + flag_execstack = 0; + break; +#endif + case 'Z': flag_always_generate_output = 1; break; @@ -907,6 +931,19 @@ main (argc, argv) md_end (); #endif +#if defined BFD_ASSEMBLER && (defined OBJ_ELF || defined OBJ_MAYBE_ELF) + if ((flag_execstack || flag_noexecstack) + && OUTPUT_FLAVOR == bfd_target_elf_flavour) + { + segT gnustack; + + gnustack = subseg_new (".note.GNU-stack", 0); + bfd_set_section_flags (stdoutput, gnustack, + SEC_READONLY | (flag_execstack ? SEC_CODE : 0)); + + } +#endif + /* If we've been collecting dwarf2 .debug_line info, either for assembly debugging or on behalf of the compiler, emit it now. */ dwarf2_finish (); diff --git a/gas/as.h b/gas/as.h index 2c5a22c..2121964 100644 --- a/gas/as.h +++ b/gas/as.h @@ -436,6 +436,12 @@ COMMON int flag_strip_local_absolute; /* True if we should generate a traditional format object file. */ COMMON int flag_traditional_format; +/* TRUE if .note.GNU-stack section with SEC_CODE should be created */ +COMMON int flag_execstack; + +/* TRUE if .note.GNU-stack section with SEC_CODE should be created */ +COMMON int flag_noexecstack; + /* name of emitted object file */ COMMON char *out_file_name; -- 2.7.4