Tidy warn-execstack handling
authorAlan Modra <amodra@gmail.com>
Fri, 20 May 2022 05:29:05 +0000 (14:59 +0930)
committerAlan Modra <amodra@gmail.com>
Fri, 20 May 2022 06:41:25 +0000 (16:11 +0930)
Make ld and bfd values consistent by swapping values 0 and 2 in
link_info.warn_execstack.  This has the benefit of making the value an
"extended" boolean, with 0 meaning no warning, 1 meaning warn, other
values a conditional warning.

Yes, this patch introduces fails on arm/aarch64.  Not a problem with
this patch but an arm/aarch64 before_parse problem.

bfd/
* elflink.c (bfd_elf_size_dynamic_sections): Adjust
warn_execstack test.
include/
* bfdlink.h (warn_execstack): Swap 0 and 2 meaning.
ld/
* configure.ac (DEFAULT_LD_WARN_EXECSTACK): Use values of 0,
1, 2 consistent with link_info.warn_execstack.
* ld.texi: Typo fixes.
* lexsup.c (parse_args): Adjust setting of link_info.warn_execstack.
(elf_static_list_options): Adjust help message conditions.
* configure: Regenerate.

bfd/elflink.c
include/bfdlink.h
ld/configure
ld/configure.ac
ld/ld.texi
ld/lexsup.c

index 4d6fe663f68ccb613c1c52abb2cf7250dd0e7aa2..96eb36aa5bf5bf34364ae5ed6d1a1d4d5b60123f 100644 (file)
@@ -7179,7 +7179,7 @@ warning: enabling an executable stack because of -z execstack command line optio
        {
          if (exec)
            {
-             if (info->warn_execstack != 2)
+             if (info->warn_execstack != 0)
                {
                  /* PR 29072: Because an executable stack is a serious
                     security risk, make sure that the user knows that it is
index 27a8e11cc2275c4e5d5aa67a7066523c05829e23..09a3ec01685d0fa5a1038885bc9e526f340764a5 100644 (file)
@@ -493,12 +493,9 @@ struct bfd_link_info
   unsigned int noexecstack: 1;
 
   /* Tri-state variable:
-     0 => warn if the linker is creating an executable stack, but
-     execstack (above) is 0.
-     1 => warn if the linker is creating an executable stack; ignores
-     the value of execstack.
-     2 => do not warn.
-     3 => not used.  */
+     0 => do not warn when creating an executable stack.
+     1 => always warn when creating an executable stack.
+     >1 => warn when creating an executable stack if execstack is 0.  */
   unsigned int warn_execstack: 2;
 
   /* TRUE if warnings should not be generated for TLS segments with eXecute
index b4b0ce14ed9e0b93c2d3bd9f57dd8ac5bd5abfb4..16db825d5ab9f1dfafbd6354c5ab8ba3044f6a27 100755 (executable)
 
 
 
-ac_default_ld_warn_execstack=unset
+# By default warn when an executable stack is created due to object files
+# requesting such, not when the user specifies -z execstack.
+ac_default_ld_warn_execstack=2
 # Check whether --enable-warn-execstack was given.
 if test "${enable_warn_execstack+set}" = set; then :
   enableval=$enable_warn_execstack; case "${enableval}" in
   yes) ac_default_ld_warn_execstack=1 ;;
-  no)  ac_default_ld_warn_execstack=-1 ;;
+  no)  ac_default_ld_warn_execstack=0 ;;
 esac
 fi
 
@@ -16997,9 +16999,6 @@ _ACEOF
 
 
 
-if test "${ac_default_ld_warn_execstack}" = unset; then
-  ac_default_ld_warn_execstack=0
-fi
 
 cat >>confdefs.h <<_ACEOF
 #define DEFAULT_LD_WARN_EXECSTACK $ac_default_ld_warn_execstack
index 0b29e810ddef2ab0a62d63e6deec1c823eb98731..01121480c6d91fd3e2d70ab59a57e90c8910b950 100644 (file)
@@ -204,13 +204,15 @@ AC_ARG_ENABLE(separate-code,
 esac])
 
 
-ac_default_ld_warn_execstack=unset
+# By default warn when an executable stack is created due to object files
+# requesting such, not when the user specifies -z execstack.
+ac_default_ld_warn_execstack=2
 AC_ARG_ENABLE(warn-execstack,
              AS_HELP_STRING([--enable-warn-execstack],
              [enable warnings when creating an executable stack]),
 [case "${enableval}" in
   yes) ac_default_ld_warn_execstack=1 ;;
-  no)  ac_default_ld_warn_execstack=-1 ;;
+  no)  ac_default_ld_warn_execstack=0 ;;
 esac])
 
 ac_default_ld_warn_rwx_segments=unset
@@ -531,9 +533,6 @@ AC_DEFINE_UNQUOTED(DEFAULT_LD_Z_SEPARATE_CODE,
   [Define to 1 if you want to enable -z separate-code in ELF linker by default.])
 
 
-if test "${ac_default_ld_warn_execstack}" = unset; then
-  ac_default_ld_warn_execstack=0
-fi
 AC_DEFINE_UNQUOTED(DEFAULT_LD_WARN_EXECSTACK,
   $ac_default_ld_warn_execstack,
   [Define to 1 if you want to enable --warn-execstack in ELF linker by default.])
index 8cad84781404b9eb6402c7807708996785543216..a2b162ce5b5a8ed1077110b02a322e4716ddc443 100644 (file)
@@ -2654,7 +2654,7 @@ object file formats.  For formats like COFF or ELF, the linker can not
 detect the use of global constructors.
 
 @kindex --warn-execstack
-@cindex warnings, on exectuable stack
+@cindex warnings, on executable stack
 @cindex executable stack, warnings on
 @item --warn-execstack
 @itemx --no-warn-execstack
@@ -2667,7 +2667,7 @@ line option has been used, but this behaviour can be overridden by the
 On the other hand the linker will normally warn if the stack is made
 executable because one or more of the input files need an execuable
 stack and neither of the @command{-z execstack} or @command{-z
-noexecstack} comman line options have been specified.  This warning
+noexecstack} command line options have been specified.  This warning
 can be disabled via the @command{--no-warn-execstack} option.
 
 Note: ELF format input files specify that they need an executable
index 78190472907351eeec19ec62ed5f3fdb155955f2..82c459adb5118b5ab79b119fc62d413e9b9f4e00 100644 (file)
@@ -927,7 +927,7 @@ parse_args (unsigned argc, char **argv)
          link_info.warn_execstack = 1;
          break;
        case OPTION_NO_WARN_EXECSTACK:
-         link_info.warn_execstack = 2;
+         link_info.warn_execstack = 0;
          break;
        case OPTION_WARN_RWX_SEGMENTS:
          link_info.no_warn_rwx_segments = 0;
@@ -2169,14 +2169,14 @@ elf_static_list_options (FILE *file)
   -z execstack                Mark executable as requiring executable stack\n"));
   fprintf (file, _("\
   -z noexecstack              Mark executable as not requiring executable stack\n"));
-#if DEFAULT_LD_WARN_EXECSTACK > 0
+#if DEFAULT_LD_WARN_EXECSTACK == 1
   fprintf (file, _("\
   --warn-execstack            Generate a warning if the stack is executable (default)\n"));
 #else
   fprintf (file, _("\
   --warn-execstack            Generate a warning if the stack is executable\n"));
 #endif
-#if DEFAULT_LD_WARN_EXECSTACK < 0
+#if DEFAULT_LD_WARN_EXECSTACK == 0
   fprintf (file, _("\
   --no-warn-execstack         Do not generate a warning if the stack is executable (default)\n"));
 #else