Tidy warn-execstack handling
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.
diff --git a/bfd/elflink.c b/bfd/elflink.c
index 4d6fe66..96eb36a 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -7179,7 +7179,7 @@
{
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
diff --git a/include/bfdlink.h b/include/bfdlink.h
index 27a8e11..09a3ec0 100644
--- a/include/bfdlink.h
+++ b/include/bfdlink.h
@@ -493,12 +493,9 @@
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
diff --git a/ld/configure b/ld/configure
index b4b0ce1..16db825 100755
--- a/ld/configure
+++ b/ld/configure
@@ -15438,12 +15438,14 @@
-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 @@
-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
diff --git a/ld/configure.ac b/ld/configure.ac
index 0b29e81..0112148 100644
--- a/ld/configure.ac
+++ b/ld/configure.ac
@@ -204,13 +204,15 @@
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 @@
[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.])
diff --git a/ld/ld.texi b/ld/ld.texi
index 8cad847..a2b162c 100644
--- a/ld/ld.texi
+++ b/ld/ld.texi
@@ -2654,7 +2654,7 @@
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 @@
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
diff --git a/ld/lexsup.c b/ld/lexsup.c
index 7819047..82c459a 100644
--- a/ld/lexsup.c
+++ b/ld/lexsup.c
@@ -927,7 +927,7 @@
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 @@
-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