binutils/binutils-rwx-seg-execstack-err-warn.patch
Nick Clifton ae2ae5459a Add linker error/warning messages for executable stacks and RWX segments.
Resolves: RHEL-59801
Resolves: RHEL-59802
2024-10-07 14:23:17 +01:00

2217 lines
92 KiB
Diff

diff -rupN binutils.orig/bfd/elf.c binutils-2.35.2/bfd/elf.c
--- binutils.orig/bfd/elf.c 2024-10-02 14:07:25.410303616 +0100
+++ binutils-2.35.2/bfd/elf.c 2024-10-02 14:11:16.135897859 +0100
@@ -6432,6 +6432,67 @@ assign_file_positions_except_relocs (bfd
alloc = i_ehdrp->e_phnum;
if (alloc != 0)
{
+ if (link_info != NULL && ! link_info->no_warn_rwx_segments)
+ {
+ bfd_boolean warned_tls = FALSE;
+ bfd_boolean warned_rwx = FALSE;
+
+ /* Memory resident segments with non-zero size and RWX
+ permissions are a security risk, so we generate a warning
+ here if we are creating any. */
+ unsigned int i;
+
+ for (i = 0; i < alloc; i++)
+ {
+ const Elf_Internal_Phdr * phdr = tdata->phdr + i;
+
+ if (phdr->p_memsz == 0)
+ continue;
+
+ if (! warned_tls
+ && phdr->p_type == PT_TLS
+ && (phdr->p_flags & PF_X))
+ {
+ if (link_info->warn_is_error_for_rwx_segments)
+ {
+ _bfd_error_handler (_("\
+error: %pB has a TLS segment with execute permission"),
+ abfd);
+ return FALSE;
+ }
+
+ _bfd_error_handler (_("\
+warning: %pB has a TLS segment with execute permission"),
+ abfd);
+ if (warned_rwx)
+ break;
+
+ warned_tls = TRUE;
+ }
+ else if (! warned_rwx
+ && phdr->p_type == PT_LOAD
+ && ((phdr->p_flags & (PF_R | PF_W | PF_X))
+ == (PF_R | PF_W | PF_X)))
+ {
+ if (link_info->warn_is_error_for_rwx_segments)
+ {
+ _bfd_error_handler (_("\
+error: %pB has a LOAD segment with RWX permissions"),
+ abfd);
+ return FALSE;
+ }
+
+ _bfd_error_handler (_("\
+warning: %pB has a LOAD segment with RWX permissions"),
+ abfd);
+ if (warned_tls)
+ break;
+
+ warned_rwx = TRUE;
+ }
+ }
+ }
+
if (bfd_seek (abfd, i_ehdrp->e_phoff, SEEK_SET) != 0
|| bed->s->write_out_phdrs (abfd, tdata->phdr, alloc) != 0)
return FALSE;
diff -rupN binutils.orig/bfd/elf32-ppc.c binutils-2.35.2/bfd/elf32-ppc.c
--- binutils.orig/bfd/elf32-ppc.c 2024-10-02 14:07:25.404303600 +0100
+++ binutils-2.35.2/bfd/elf32-ppc.c 2024-10-02 14:11:16.136897862 +0100
@@ -4024,12 +4024,20 @@ ppc_elf_select_plt_layout (bfd *output_b
htab->plt_type = plt_type;
}
}
- if (htab->plt_type == PLT_OLD && htab->params->plt_style == PLT_NEW)
+
+ if (htab->plt_type == PLT_OLD)
{
- if (htab->old_bfd != NULL)
- _bfd_error_handler (_("bss-plt forced due to %pB"), htab->old_bfd);
- else
- _bfd_error_handler (_("bss-plt forced by profiling"));
+ if (!info->user_warn_rwx_segments)
+ info->no_warn_rwx_segments = 1;
+ if (htab->params->plt_style == PLT_NEW
+ || (htab->params->plt_style != PLT_OLD
+ && !info->no_warn_rwx_segments))
+ {
+ if (htab->old_bfd != NULL)
+ _bfd_error_handler (_("bss-plt forced due to %pB"), htab->old_bfd);
+ else
+ _bfd_error_handler (_("bss-plt forced by profiling"));
+ }
}
BFD_ASSERT (htab->plt_type != PLT_VXWORKS);
diff -rupN binutils.orig/bfd/elflink.c binutils-2.35.2/bfd/elflink.c
--- binutils.orig/bfd/elflink.c 2024-10-02 14:07:25.410303616 +0100
+++ binutils-2.35.2/bfd/elflink.c 2024-10-02 14:11:16.138897867 +0100
@@ -6923,13 +6923,34 @@ bfd_elf_size_dynamic_sections (bfd *outp
/* Determine any GNU_STACK segment requirements, after the backend
has had a chance to set a default segment size. */
if (info->execstack)
- elf_stack_flags (output_bfd) = PF_R | PF_W | PF_X;
+ {
+ /* If the user has explicitly requested warnings, then generate one even
+ though the choice is the result of another command line option. */
+ if (info->warn_execstack == 1)
+ {
+ if (info->error_execstack)
+ {
+ _bfd_error_handler
+ (_("\
+error: creating an executable stack because of -z execstack command line option"));
+ return FALSE;
+ }
+
+ _bfd_error_handler
+ (_("\
+warning: enabling an executable stack because of -z execstack command line option"));
+ }
+
+ elf_stack_flags (output_bfd) = PF_R | PF_W | PF_X;
+ }
else if (info->noexecstack)
elf_stack_flags (output_bfd) = PF_R | PF_W;
else
{
bfd *inputobj;
asection *notesec = NULL;
+ bfd *noteobj = NULL;
+ bfd *emptyobj = NULL;
int exec = 0;
for (inputobj = info->input_bfds;
@@ -6948,15 +6969,68 @@ bfd_elf_size_dynamic_sections (bfd *outp
s = bfd_get_section_by_name (inputobj, ".note.GNU-stack");
if (s)
{
- if (s->flags & SEC_CODE)
- exec = PF_X;
notesec = s;
+ if (s->flags & SEC_CODE)
+ {
+ noteobj = inputobj;
+ exec = PF_X;
+ /* There is no point in scanning the remaining bfds. */
+ break;
+ }
+ }
+ else if (bed->default_execstack && info->default_execstack)
+ {
+ exec = PF_X;
+ emptyobj = inputobj;
}
- else if (bed->default_execstack)
- exec = PF_X;
}
+
if (notesec || info->stacksize > 0)
- elf_stack_flags (output_bfd) = PF_R | PF_W | exec;
+ {
+ if (exec)
+ {
+ 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
+ being enabled despite the fact that it was not requested
+ on the command line. */
+ if (noteobj)
+ {
+ if (info->error_execstack)
+ {
+ _bfd_error_handler (_("\
+error: %s: is triggering the generation of an executable stack (because it has an executable .note.GNU-stack section)"),
+ bfd_get_filename (noteobj));
+ return FALSE;
+ }
+
+ _bfd_error_handler (_("\
+warning: %s: requires executable stack (because the .note.GNU-stack section is executable)"),
+ bfd_get_filename (noteobj));
+ }
+ else if (emptyobj)
+ {
+ if (info->error_execstack)
+ {
+ _bfd_error_handler (_("\
+error: %s: is triggering the generation of an executable stack because it does not have a .note.GNU-stack section"),
+ bfd_get_filename (emptyobj));
+ return FALSE;
+ }
+
+ _bfd_error_handler (_("\
+warning: %s: missing .note.GNU-stack section implies executable stack"),
+ bfd_get_filename (emptyobj));
+ _bfd_error_handler (_("\
+NOTE: This behaviour is deprecated and will be removed in a future version of the linker"));
+ }
+ }
+ }
+
+ elf_stack_flags (output_bfd) = PF_R | PF_W | exec;
+ }
+
if (notesec && exec && bfd_link_relocatable (info)
&& notesec->output_section != bfd_abs_section_ptr)
notesec->output_section->flags |= SEC_CODE;
diff -rupN binutils.orig/binutils/testsuite/lib/binutils-common.exp binutils-2.35.2/binutils/testsuite/lib/binutils-common.exp
--- binutils.orig/binutils/testsuite/lib/binutils-common.exp 2024-10-02 14:07:25.084302776 +0100
+++ binutils-2.35.2/binutils/testsuite/lib/binutils-common.exp 2024-10-02 14:11:16.140897872 +0100
@@ -527,34 +527,26 @@ proc prune_warnings_extra { text } {
# PR binutils/23898: It is OK to have gaps in build notes.
regsub -all "(^|\n)(\[^\n\]*: Warning: Gap in build notes detected from\[^\n\]*\n?)+" $text "\\1" text
+ # Many tests use assembler source files without a .note.GNU-stack section.
+ # So ignore warnings about it being missing.
+ regsub -all "(^|\n)(\[^\n\]*: warning:\[^\n\]*missing \\.note\\.GNU-stack section\[^\n\]*\n?)+" $text "\\1" text
+ regsub -all "(^|\n)(\[^\n\]*: NOTE: This behaviour is deprecated\[^\n\]*\n?)+" $text "\\1" text
+
+ # Ignore warnings about RWX segments.
+ regsub -all "(^|\n)(\[^\n\]*: warning:\[^\n\]*has a LOAD segment with RWX permissions\[^\n\]*\n?)+" $text "\\1" text
+ regsub -all "(^|\n)(\[^\n\]*: warning:\[^\n\]*has a TLS segment with execute permission\[^\n\]*\n?)+" $text "\\1" text
+
+ # Configuring with --enable-warn-execstack=yes will generate warnings if
+ # -z execstack is used.
+ regsub -all "(^|\n)(\[^\n\]*: warning: enabling an executable stack because of -z execstack command line option\[^\n\]*\n?)+" $text "\\1" text
+
# Ignore LTO warnings triggered by configuring with --enable-pgo-build=lto.
regsub -all "(^|\n)(\[^\n\]*lto-wrapper: warning: using serial compilation of \[0-9\]+ LTRANS jobs\[^\n\]*\n?)+" $text "\\1" text
return $text
}
-# This definition is taken from an unreleased version of DejaGnu. Once
-# that version gets released, and has been out in the world for a few
-# months at least, it may be safe to delete this copy.
-if ![string length [info proc prune_warnings]] {
- #
- # prune_warnings -- delete various system verbosities from TEXT
- #
- # An example is:
- # ld.so: warning: /usr/lib/libc.so.1.8.1 has older revision than expected 9
- #
- # Sites with particular verbose os's may wish to override this in site.exp.
- #
- proc prune_warnings { text } {
- # This is from sun4's. Do it for all machines for now.
- # The "\\1" is to try to preserve a "\n" but only if necessary.
- regsub -all "(^|\n)(ld.so: warning:\[^\n\]*\n?)+" $text "\\1" text
- # It might be tempting to get carried away and delete blank lines, etc.
- # Just delete *exactly* what we're ask to, and that's it.
- set text [prune_warnings_extra $text]
- return $text
- }
-} elseif { [info procs saved-prune_warnings] == [list] } {
+if { [info procs saved-prune_warnings] == [list] } {
rename prune_warnings saved-prune_warnings
proc prune_warnings { text } {
set text [saved-prune_warnings $text]
@@ -563,6 +555,22 @@ if ![string length [info proc prune_warn
}
}
+# prune_dump_output OUTPUT
+#
+# Clean up the output from system specific or unwanted characters.
+# This allows to simplify the regexp inside dump tests.
+proc prune_dump_output { output } {
+ if [ishost "*-*-mingw*"] {
+ # Prune DOS drive letter from an absolute path if it appears
+ # at the beginning of a line.
+ regsub -all {(^|\n)[[:alpha:]]:(/|\\)} $output "\\1\\2" output
+ }
+
+ # Prune last end of line.
+ regsub "\n$" $output "" output
+ return $output
+}
+
# run_dump_test FILE (optional:) EXTRA_OPTIONS
#
# Assemble a .s file, then run some utility on it and check the output.
@@ -1169,7 +1177,7 @@ proc run_dump_test { name {extra_options
send_log "$cmd\n"
set cmdret [remote_exec host [concat sh -c [list "$cmd 2>&1"]] "" "/dev/null" "dump.tmp"]
remote_upload host "dump.tmp"
- append comp_output [file_contents "dump.tmp"]
+ append comp_output [prune_warnings [file_contents "dump.tmp"]]
remote_file host delete "dump.tmp"
remote_file build delete "dump.tmp"
set cmdret [lindex $cmdret 0]
@@ -1186,7 +1194,7 @@ proc run_dump_test { name {extra_options
send_log "$cmd\n"
set cmdret [remote_exec host [concat sh -c [list "$cmd 2>&1"]] "" "/dev/null" "dump.tmp"]
remote_upload host "dump.tmp"
- append comp_output [file_contents "dump.tmp"]
+ append comp_output [prune_warnings [file_contents "dump.tmp"]]
remote_file host delete "dump.tmp"
remote_file build delete "dump.tmp"
set cmdret [lindex $cmdret 0]
@@ -1276,7 +1284,7 @@ proc run_dump_test { name {extra_options
}
}
- regsub "\n$" $comp_output "" comp_output
+ set comp_output [prune_dump_output $comp_output]
if { $cmdret != 0 || $comp_output != "" || $want_out(source) != "" } {
set exitstat "succeeded"
if { $cmdret != 0 } { set exitstat "failed" }
diff -rupN binutils.orig/include/bfdlink.h binutils-2.35.2/include/bfdlink.h
--- binutils.orig/include/bfdlink.h 2024-10-02 14:07:25.068302735 +0100
+++ binutils-2.35.2/include/bfdlink.h 2024-10-02 14:11:16.143897880 +0100
@@ -478,14 +478,56 @@ struct bfd_link_info
--dynamic-list command line options. */
unsigned int dynamic: 1;
- /* TRUE if PT_GNU_STACK segment should be created with PF_R|PF_W|PF_X
- flags. */
+ /* Set if the "-z execstack" option has been used to request that a
+ PT_GNU_STACK segment should be created with PF_R, PF_W and PF_X
+ flags set.
+
+ Note - if performing a relocatable link then a .note.GNU-stack
+ section will be created instead, if one does not exist already.
+ The section will have the SHF_EXECINSTR flag bit set. */
unsigned int execstack: 1;
- /* TRUE if PT_GNU_STACK segment should be created with PF_R|PF_W
- flags. */
+ /* Set if the "-z noexecstack" option has been used to request that a
+ PT_GNU_STACK segment should be created with PF_R and PF_W flags. Or
+ a non-executable .note.GNU-stack section for relocateable links.
+
+ Note - this flag is not quite orthogonal to execstack, since both
+ of these flags can be 0. In this case a stack segment can still
+ be created, but it will only have the PF_X flag bit set if one or
+ more of the input files contains a .note.GNU-stack section with the
+ SHF_EXECINSTR flag bit set, or if the default behaviour for the
+ architecture is to create executable stacks.
+
+ The execstack and noexecstack flags should never both be 1. */
unsigned int noexecstack: 1;
+ /* Tri-state variable:
+ 0 => do not warn when creating an executable stack.
+ 1 => always warn when creating an executable stack (for any reason).
+ 2 => only warn when an executable stack has been requested an object
+ file and execstack is 0 or noexecstack is 1.
+ 3 => not used. */
+ unsigned int warn_execstack: 2;
+ /* TRUE if a warning generated because of warn_execstack should be instead
+ be treated as an error. */
+ unsigned int error_execstack: 1;
+
+ /* TRUE if warnings should NOT be generated for TLS segments with eXecute
+ permission or LOAD segments with RWX permissions. */
+ unsigned int no_warn_rwx_segments: 1;
+ /* TRUE if the user gave either --warn-rwx-segments or
+ --no-warn-rwx-segments on the linker command line. */
+ unsigned int user_warn_rwx_segments: 1;
+ /* TRUE if warnings generated when no_warn_rwx_segements is 0 should
+ instead be treated as errors. */
+ unsigned int warn_is_error_for_rwx_segments: 1;
+
+ /* TRUE if the stack can be made executable because of the absence of a
+ .note.GNU-stack section in an input file. Note - even if this field
+ is set, some targets may choose to ignore the setting and not create
+ an executable stack. */
+ unsigned int default_execstack : 1;
+
/* TRUE if we want to produced optimized output files. This might
need much more time and therefore must be explicitly selected. */
unsigned int optimize: 1;
diff -rupN binutils.orig/ld/NEWS binutils-2.35.2/ld/NEWS
--- binutils.orig/ld/NEWS 2024-10-02 14:07:25.239303176 +0100
+++ binutils-2.35.2/ld/NEWS 2024-10-02 14:11:16.144897883 +0100
@@ -1,5 +1,44 @@
-*- text -*-
+* Added --warn-execstack-objects to warn about executable stacks only when an
+ input object file requests one. Also added --error-execstack and
+ --error-rxw-segments options to convert warnings about executable stacks and
+ segments into errors.
+
+ Also added --enable-error-execstack=[yes|no] and
+ --enable-error-rwx-segments=[yes|no] configure options to set the default for
+ converting warnings into errors.
+
+* The ELF linker will now generate a warning message if the stack is made
+ executable. By default this warning is not issued if the user has
+ specifically requested an executable stack via the "-z execstack"
+ command line option, but the warning can be forced via the new
+ "--warn-execstack" option. Alternatively all warnings about creating
+ an executable stack can be suppressed via the "--no-warn-execstack"
+ option.
+
+ In addition the ELF linker will also warn if it creates a memory resident
+ segment with all three of the Read, Write and eXecute permissions set, or
+ if it creates a thread local data segment with the eXecute permission set.
+ These warnings can be disabled via --no-warn-rwx-segments option and
+ re-enabled via the --warn-rwx-segments option.
+
+ New configure options can also control these new features:
+
+ --enable-warn-execstack=no
+ will disable the warnings about creating an executable stack.
+
+ --enable-warn-execstack=yes
+ will make --warn-execstack enabled by default.
+
+ --enable-warn-rwx-segments=no
+ will make --no-warn-rwx-segments enabled by default.
+
+ --enable-default-execstack=no
+ will stop the creation of an executable stack simply because an input file
+ is missing a .note.GNU-stack section, even on architectures where this
+ behaviour is the default.
+
Changes in 2.35:
* X86 NaCl target support is removed.
diff -rupN binutils.orig/ld/config.in binutils-2.35.2/ld/config.in
--- binutils.orig/ld/config.in 2024-10-02 14:07:25.094302802 +0100
+++ binutils-2.35.2/ld/config.in 2024-10-02 14:11:16.144897883 +0100
@@ -16,12 +16,32 @@
/* Define if you want compressed debug sections by default. */
#undef DEFAULT_FLAG_COMPRESS_DEBUG
+/* Define to 1 if you want to turn executable stack warnings into errors by
+ default. */
+#undef DEFAULT_LD_ERROR_EXECSTACK
+
+/* Define to 1 if you want to turn executable segment warnings into errors by
+ default. */
+#undef DEFAULT_LD_ERROR_RWX_SEGMENTS
+
+/* Define to 0 if you want to disable the generation of an executable stack
+ when a .note-GNU-stack section is missing. */
+#undef DEFAULT_LD_EXECSTACK
+
/* The default method for DT_TEXTREL check in ELF linker. */
#undef DEFAULT_LD_TEXTREL_CHECK
/* Define to 1 if DT_TEXTREL check is warning in ELF linker by default. */
#undef DEFAULT_LD_TEXTREL_CHECK_WARNING
+/* Define to 1 if you want to enable --warn-execstack in ELF linker by
+ default. */
+#undef DEFAULT_LD_WARN_EXECSTACK
+
+/* Define to 0 if you want to disable --warn-rwx-segments in ELF linker by
+ default. */
+#undef DEFAULT_LD_WARN_RWX_SEGMENTS
+
/* Define to 1 if you want to enable -z relro in ELF linker by default. */
#undef DEFAULT_LD_Z_RELRO
diff -rupN binutils.orig/ld/configure binutils-2.35.2/ld/configure
--- binutils.orig/ld/configure 2024-10-02 14:07:25.239303176 +0100
+++ binutils-2.35.2/ld/configure 2024-10-02 14:11:16.145897885 +0100
@@ -833,6 +833,11 @@ enable_new_dtags
enable_relro
enable_textrel_check
enable_separate_code
+enable_warn_execstack
+enable_error_execstack
+enable_warn_rwx_segments
+enable_error_rwx_segments
+enable_default_execstack
enable_default_hash_style
enable_libctf
enable_werror
@@ -1503,6 +1508,17 @@ Optional Features:
--enable-textrel-check=[yes|no|warning|error]
enable DT_TEXTREL check in ELF linker
--enable-separate-code enable -z separate-code in ELF linker by default
+ --enable-warn-execstack enable warnings when creating an executable stack
+ --enable-error-execstack
+ turn executable stack warnings into errors
+ --enable-warn-rwx-segments
+ enable warnings when creating segments with RWX
+ permissions
+ --enable-error-rwx-segments
+ turn executable segment warnings into errors
+ --enable-default-execstack
+ create an executable stack if an input file is
+ missing a .note.GNU-stack section
--enable-default-hash-style={sysv,gnu,both}
use this default hash style
--enable-libctf Handle .ctf type-info sections [default=yes]
@@ -15926,6 +15918,60 @@ esac
fi
+
+# 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=0 ;;
+esac
+fi
+
+
+ac_default_ld_error_execstack=0
+# Check whether --enable-error-execstack was given.
+if test "${enable_error_execstack+set}" = set; then :
+ enableval=$enable_error_execstack; case "${enableval}" in
+ yes) ac_default_ld_error_execstack=1 ;;
+ no) ac_default_ld_error_execstack=0 ;;
+esac
+fi
+
+
+ac_default_ld_warn_rwx_segments=unset
+# Check whether --enable-warn-rwx-segments was given.
+if test "${enable_warn_rwx_segments+set}" = set; then :
+ enableval=$enable_warn_rwx_segments; case "${enableval}" in
+ yes) ac_default_ld_warn_rwx_segments=1 ;;
+ no) ac_default_ld_warn_rwx_segments=0 ;;
+esac
+fi
+
+
+ac_default_ld_error_rwx_segments=0
+# Check whether --enable-error-rwx-segments was given.
+if test "${enable_error_rwx_segments+set}" = set; then :
+ enableval=$enable_error_rwx_segments; case "${enableval}" in
+ yes) ac_default_ld_error_rwx_segments=1 ;;
+ no) ac_default_ld_error_rwx_segments=0 ;;
+esac
+fi
+
+
+ac_default_ld_default_execstack=unset
+# Check whether --enable-default-execstack was given.
+if test "${enable_default_execstack+set}" = set; then :
+ enableval=$enable_default_execstack; case "${enableval}" in
+ yes) ac_default_ld_default_execstack=1 ;;
+ no) ac_default_ld_default_execstack=0 ;;
+esac
+fi
+
+
+
# Decide which "--hash-style" to use by default
# Provide a configure time option to override our default.
# Check whether --enable-default-hash-style was given.
@@ -17732,6 +17778,44 @@ _ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define DEFAULT_LD_WARN_EXECSTACK $ac_default_ld_warn_execstack
+_ACEOF
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define DEFAULT_LD_ERROR_EXECSTACK $ac_default_ld_error_execstack
+_ACEOF
+
+
+if test "${ac_default_ld_warn_rwx_segments}" = unset; then
+ ac_default_ld_warn_rwx_segments=1
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define DEFAULT_LD_WARN_RWX_SEGMENTS $ac_default_ld_warn_rwx_segments
+_ACEOF
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define DEFAULT_LD_ERROR_RWX_SEGMENTS $ac_default_ld_error_rwx_segments
+_ACEOF
+
+
+if test "${ac_default_ld_default_execstack}" = unset; then
+ ac_default_ld_default_execstack=1
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define DEFAULT_LD_EXECSTACK $ac_default_ld_default_execstack
+_ACEOF
+
+
+
+
diff -rupN binutils.orig/ld/configure.ac binutils-2.35.2/ld/configure.ac
--- binutils.orig/ld/configure.ac 2024-10-02 14:07:25.238303173 +0100
+++ binutils-2.35.2/ld/configure.ac 2024-10-02 14:11:16.145897885 +0100
@@ -195,6 +195,55 @@ AC_ARG_ENABLE(separate-code,
no) ac_default_ld_z_separate_code=0 ;;
esac])
+
+# 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=0 ;;
+esac])
+
+ac_default_ld_error_execstack=0
+AC_ARG_ENABLE(error-execstack,
+ AS_HELP_STRING([--enable-error-execstack],
+ [turn executable stack warnings into errors]),
+[case "${enableval}" in
+ yes) ac_default_ld_error_execstack=1 ;;
+ no) ac_default_ld_error_execstack=0 ;;
+esac])
+
+ac_default_ld_warn_rwx_segments=unset
+AC_ARG_ENABLE(warn-rwx-segments,
+ AS_HELP_STRING([--enable-warn-rwx-segments],
+ [enable warnings when creating segments with RWX permissions]),
+[case "${enableval}" in
+ yes) ac_default_ld_warn_rwx_segments=1 ;;
+ no) ac_default_ld_warn_rwx_segments=0 ;;
+esac])
+
+ac_default_ld_error_rwx_segments=0
+AC_ARG_ENABLE(error-rwx-segments,
+ AS_HELP_STRING([--enable-error-rwx-segments],
+ [turn executable segment warnings into errors]),
+[case "${enableval}" in
+ yes) ac_default_ld_error_rwx_segments=1 ;;
+ no) ac_default_ld_error_rwx_segments=0 ;;
+esac])
+
+ac_default_ld_default_execstack=unset
+AC_ARG_ENABLE(default-execstack,
+ AS_HELP_STRING([--enable-default-execstack],
+ [create an executable stack if an input file is missing a .note.GNU-stack section]),
+[case "${enableval}" in
+ yes) ac_default_ld_default_execstack=1 ;;
+ no) ac_default_ld_default_execstack=0 ;;
+esac])
+
+
# Decide which "--hash-style" to use by default
# Provide a configure time option to override our default.
AC_ARG_ENABLE([default-hash-style],
@@ -496,6 +545,34 @@ AC_DEFINE_UNQUOTED([DEFAULT_EMIT_GNU_HAS
[$ac_default_emit_gnu_hash],
[Define to 1 if you want to emit gnu hash in the ELF linker by default.])
+
+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.])
+
+AC_DEFINE_UNQUOTED(DEFAULT_LD_ERROR_EXECSTACK,
+ $ac_default_ld_error_execstack,
+ [Define to 1 if you want to turn executable stack warnings into errors by default.])
+
+if test "${ac_default_ld_warn_rwx_segments}" = unset; then
+ ac_default_ld_warn_rwx_segments=1
+fi
+AC_DEFINE_UNQUOTED(DEFAULT_LD_WARN_RWX_SEGMENTS,
+ $ac_default_ld_warn_rwx_segments,
+ [Define to 0 if you want to disable --warn-rwx-segments in ELF linker by default.])
+
+AC_DEFINE_UNQUOTED(DEFAULT_LD_ERROR_RWX_SEGMENTS,
+ $ac_default_ld_error_rwx_segments,
+ [Define to 1 if you want to turn executable segment warnings into errors by default.])
+
+if test "${ac_default_ld_default_execstack}" = unset; then
+ ac_default_ld_default_execstack=1
+fi
+AC_DEFINE_UNQUOTED(DEFAULT_LD_EXECSTACK,
+ $ac_default_ld_default_execstack,
+ [Define to 0 if you want to disable the generation of an executable stack when a .note-GNU-stack section is missing.])
+
+
AC_SUBST(elf_list_options)
AC_SUBST(elf_shlib_list_options)
AC_SUBST(elf_plt_unwind_list_options)
diff -rupN binutils.orig/ld/configure.tgt binutils-2.35.2/ld/configure.tgt
--- binutils.orig/ld/configure.tgt 2024-10-02 14:07:25.239303176 +0100
+++ binutils-2.35.2/ld/configure.tgt 2024-10-02 14:11:16.146897887 +0100
@@ -40,6 +40,45 @@ targ_extra_ofiles="ldelf.o ldelfgen.o"
targ64_extra_emuls=
targ64_extra_libpath=
+# By default the linker will generate warnings if it is creating an
+# executable stack or a segment with all three of read, write and
+# execute permissions. These settings are not appropriate for all
+# targets however, so we can change them here:
+
+if test "${ac_default_ld_warn_rwx_segments}" = unset; then
+ case "${targ}" in
+ # The CRIS and V850 default linker scripts yields just one segment
+ # as intended, so a rwx segment warning is not helpful.
+ # The HPPA's and SPARC's PLT sections use a constructed trampoline
+ # hence it needs to have a RWX segment.
+ # Many MIPS targets use executable segments.
+ cris-*-* | crisv32-*-* | \
+ hppa*-*-* | \
+ mips*-*-* | \
+ microblaze*-*-* | \
+ sparc*-*-* | \
+ v850*-*-*)
+ ac_default_ld_warn_rwx_segments=0
+ ;;
+ *)
+ ;;
+ esac
+fi
+
+if test "${ac_default_ld_warn_execstack}" = 2; then
+ case "${targ}" in
+ # The HPPA port needs to support older kernels that
+ # use executable stacks for signals and syscalls.
+ # Many MIPS targets use executable stacks.
+ hppa*-*-* | \
+ mips*-*-*)
+ ac_default_ld_warn_execstack=0
+ ;;
+ *)
+ ;;
+ esac
+fi
+
# Please try to keep this table more or less in alphabetic order - it
# makes it much easier to lookup a specific archictecture.
case "${targ}" in
diff -rupN binutils.orig/ld/emultempl/aarch64elf.em binutils-2.35.2/ld/emultempl/aarch64elf.em
--- binutils.orig/ld/emultempl/aarch64elf.em 2024-10-02 14:07:25.093302800 +0100
+++ binutils-2.35.2/ld/emultempl/aarch64elf.em 2024-10-02 14:11:16.146897887 +0100
@@ -54,6 +54,9 @@ fragment <<EOF
EOF
fi
fragment <<EOF
+ link_info.warn_execstack = DEFAULT_LD_WARN_EXECSTACK;
+ link_info.no_warn_rwx_segments = ! DEFAULT_LD_WARN_RWX_SEGMENTS;
+ link_info.default_execstack = DEFAULT_LD_EXECSTACK;
}
static void
diff -rupN binutils.orig/ld/emultempl/armelf.em binutils-2.35.2/ld/emultempl/armelf.em
--- binutils.orig/ld/emultempl/armelf.em 2024-10-02 14:07:25.093302800 +0100
+++ binutils-2.35.2/ld/emultempl/armelf.em 2024-10-02 14:11:16.146897887 +0100
@@ -67,6 +67,9 @@ fragment <<EOF
EOF
fi
fragment <<EOF
+ link_info.warn_execstack = DEFAULT_LD_WARN_EXECSTACK;
+ link_info.no_warn_rwx_segments = ! DEFAULT_LD_WARN_RWX_SEGMENTS;
+ link_info.default_execstack = DEFAULT_LD_EXECSTACK;
}
static void
diff -rupN binutils.orig/ld/emultempl/elf.em binutils-2.35.2/ld/emultempl/elf.em
--- binutils.orig/ld/emultempl/elf.em 2024-10-02 14:07:25.093302800 +0100
+++ binutils-2.35.2/ld/emultempl/elf.em 2024-10-02 14:11:16.146897887 +0100
@@ -90,6 +90,11 @@ EOF
fi
fragment <<EOF
link_info.separate_code = DEFAULT_LD_Z_SEPARATE_CODE;
+ link_info.warn_execstack = DEFAULT_LD_WARN_EXECSTACK;
+ link_info.no_warn_rwx_segments = ! DEFAULT_LD_WARN_RWX_SEGMENTS;
+ link_info.default_execstack = DEFAULT_LD_EXECSTACK;
+ link_info.error_execstack = DEFAULT_LD_ERROR_EXECSTACK;
+ link_info.warn_is_error_for_rwx_segments = DEFAULT_LD_ERROR_RWX_SEGMENTS;
}
EOF
diff -rupN binutils.orig/ld/emultempl/scoreelf.em binutils-2.35.2/ld/emultempl/scoreelf.em
--- binutils.orig/ld/emultempl/scoreelf.em 2024-10-02 14:07:25.093302800 +0100
+++ binutils-2.35.2/ld/emultempl/scoreelf.em 2024-10-02 14:11:16.146897887 +0100
@@ -47,6 +47,9 @@ fragment <<EOF
EOF
fi
fragment <<EOF
+ link_info.warn_execstack = DEFAULT_LD_WARN_EXECSTACK;
+ link_info.no_warn_rwx_segments = ! DEFAULT_LD_WARN_RWX_SEGMENTS;
+ link_info.default_execstack = DEFAULT_LD_EXECSTACK;
}
static void
diff -rupN binutils.orig/ld/ld.texi binutils-2.35.2/ld/ld.texi
--- binutils.orig/ld/ld.texi 2024-10-02 14:07:25.238303173 +0100
+++ binutils-2.35.2/ld/ld.texi 2024-10-02 14:11:16.147897890 +0100
@@ -2422,6 +2422,56 @@ Warn if any global constructors are used
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 executable stack
+@cindex executable stack, warnings on
+@item --warn-execstack
+@itemx --warn-execstack-objects
+@itemx --no-warn-execstack
+On ELF platforms the linker may generate warning messages if it is
+asked to create an output file that contains an executable stack.
+There are three possible states:
+@enumerate
+@item
+Do not generate any warnings.
+@item
+Always generate warnings, even if the executable stack is requested
+via the @option{-z execstack} command line option.
+@item
+Only generate a warning if an object file requests an executable
+stack, but not if the @option{-z execstack} option is used.
+@end enumerate
+
+The default state depends upon how the linker was configured when it
+was built. The @option{--no-warn-execstack} option always puts the
+linker into the no-warnings state. The @option{--warn-execstack}
+option puts the linker into the warn-always state. The
+@option{--warn-execstack-objects} option puts the linker into the
+warn-for-object-files-only state.
+
+Note: ELF format input files can specify that they need an executable
+stack by having a @var{.note.GNU-stack} section with the executable
+bit set in its section flags. They can specify that they do not need
+an executable stack by having the same section, but without the
+executable flag bit set. If an input file does not have a
+@var{.note.GNU-stack} section then the default behaviour is target
+specific. For some targets, then absence of such a section implies
+that an executable stack @emph{is} required. This is often a problem
+for hand crafted assembler files.
+
+@kindex --error-execstack
+@item --error-execstack
+@itemx --no-error-execstack
+If the linker is going to generate a warning message about an
+executable stack then the @option{--error-execstack} option will
+instead change that warning into an error. Note - this option does
+not change the linker's execstack warning generation state. Use
+@option{--warn-execstack} or @option{--warn-execstack-objects} to set
+a specific warning state.
+
+The @option{--no-error-execstack} option will restore the default
+behaviour of generating warning messages.
+
@kindex --warn-multiple-gp
@item --warn-multiple-gp
Warn if multiple global pointer values are required in the output file.
@@ -2443,6 +2493,36 @@ option causes a warning to be issued whe
Only warn once for each undefined symbol, rather than once per module
which refers to it.
+@kindex --warn-rwx-segments
+@cindex warnings, on writeable and exectuable segments
+@cindex executable segments, warnings on
+@item --warn-rwx-segments
+@itemx --no-warn-rwx-segments
+Warn if the linker creates a loadable, non-zero sized segment that has
+all three of the read, write and execute permission flags set. Such a
+segment represents a potential security vulnerability. In addition
+warnings will be generated if a thread local storage segment is
+created with the execute permission flag set, regardless of whether or
+not it has the read and/or write flags set.
+
+These warnings are enabled by default. They can be disabled via the
+@option{--no-warn-rwx-segments} option and re-enabled via the
+@option{--warn-rwx-segments} option.
+
+@kindex --error-rwx-segments
+@item --error-rwx-segments
+@itemx --no-error-rwx-segments
+If the linker is going to generate a warning message about an
+executable, writeable segment, or an executable TLS segment, then the
+@option{--error-rwx-segments} option will turn this warning into an
+error instead. The @option{--no-error-rwx-segments} option will
+restore the default behaviour of just generating a warning message.
+
+Note - the @option{--error-rwx-segments} option does not by itself
+turn on warnings about these segments. These warnings are either
+enabled by default, if the linker was configured that way, or via the
+@option{--warn-rwx-segments} command line option.
+
@kindex --warn-section-align
@cindex warnings, on section alignment
@cindex section alignment, warnings on
diff -rupN binutils.orig/ld/ldelf.c binutils-2.35.2/ld/ldelf.c
--- binutils.orig/ld/ldelf.c 2024-10-02 14:07:25.239303176 +0100
+++ binutils-2.35.2/ld/ldelf.c 2024-10-02 14:11:16.148897893 +0100
@@ -1045,7 +1045,7 @@ ldelf_after_open (int use_libpath, int n
{
if (!bfd_input_just_syms (abfd)
&& elf_tdata (abfd) != NULL
- && elf_tdata (abfd)->elf_header != NULL
+ /* && elf_tdata (abfd)->elf_header != NULL */
/* FIXME: Maybe check for other non-supportable types as well ? */
&& elf_tdata (abfd)->elf_header->e_type == ET_EXEC)
einfo (_("%P: Using an executable file (%pB) as input to a link is deprecated - support is likely to be removed in the future\n"),
diff -rupN binutils.orig/ld/ldlex.h binutils-2.35.2/ld/ldlex.h
--- binutils.orig/ld/ldlex.h 2024-10-02 14:07:25.094302802 +0100
+++ binutils-2.35.2/ld/ldlex.h 2024-10-02 14:11:16.148897893 +0100
@@ -155,6 +155,16 @@ enum option_values
OPTION_NON_CONTIGUOUS_REGIONS,
OPTION_NON_CONTIGUOUS_REGIONS_WARNINGS,
OPTION_DEPENDENCY_FILE,
+
+ OPTION_ERROR_EXECSTACK,
+ OPTION_NO_ERROR_EXECSTACK,
+ OPTION_WARN_EXECSTACK_OBJECTS,
+ OPTION_WARN_EXECSTACK,
+ OPTION_NO_WARN_EXECSTACK,
+ OPTION_WARN_RWX_SEGMENTS,
+ OPTION_NO_WARN_RWX_SEGMENTS,
+ OPTION_ERROR_RWX_SEGMENTS,
+ OPTION_NO_ERROR_RWX_SEGMENTS,
};
/* The initial parser states. */
diff -rupN binutils.orig/ld/lexsup.c binutils-2.35.2/ld/lexsup.c
--- binutils.orig/ld/lexsup.c 2024-10-02 14:07:25.094302802 +0100
+++ binutils-2.35.2/ld/lexsup.c 2024-10-02 14:11:16.149897895 +0100
@@ -520,6 +520,27 @@ static const struct ld_option ld_options
{ {"warn-constructors", no_argument, NULL, OPTION_WARN_CONSTRUCTORS},
'\0', NULL, N_("Warn if global constructors/destructors are seen"),
TWO_DASHES },
+
+ { {"error-execstack", no_argument, NULL, OPTION_ERROR_EXECSTACK},
+ '\0', NULL, NULL, TWO_DASHES },
+ { {"no-error-execstack", no_argument, NULL, OPTION_NO_ERROR_EXECSTACK},
+ '\0', NULL, NULL, TWO_DASHES },
+ { {"warn-execstack-objects", no_argument, NULL, OPTION_WARN_EXECSTACK_OBJECTS},
+ '\0', NULL, NULL, TWO_DASHES },
+ { {"warn-execstack", no_argument, NULL, OPTION_WARN_EXECSTACK},
+ '\0', NULL, NULL, TWO_DASHES },
+ { {"no-warn-execstack", no_argument, NULL, OPTION_NO_WARN_EXECSTACK},
+ '\0', NULL, NULL, TWO_DASHES },
+
+ { {"error-rwx-segments", no_argument, NULL, OPTION_ERROR_RWX_SEGMENTS},
+ '\0', NULL, NULL, TWO_DASHES },
+ { {"no-error-rwx-segments", no_argument, NULL, OPTION_NO_ERROR_RWX_SEGMENTS},
+ '\0', NULL, NULL, TWO_DASHES },
+ { {"warn-rwx-segments", no_argument, NULL, OPTION_WARN_RWX_SEGMENTS},
+ '\0', NULL, NULL, TWO_DASHES },
+ { {"no-warn-rwx-segments", no_argument, NULL, OPTION_NO_WARN_RWX_SEGMENTS},
+ '\0', NULL, NULL, TWO_DASHES },
+
{ {"warn-multiple-gp", no_argument, NULL, OPTION_WARN_MULTIPLE_GP},
'\0', NULL, N_("Warn if the multiple GP values are used"), TWO_DASHES },
{ {"warn-once", no_argument, NULL, OPTION_WARN_ONCE},
@@ -873,6 +894,38 @@ parse_args (unsigned argc, char **argv)
case OPTION_NON_CONTIGUOUS_REGIONS_WARNINGS:
link_info.non_contiguous_regions_warnings = TRUE;
break;
+
+ case OPTION_ERROR_EXECSTACK:
+ link_info.error_execstack = 1;
+ break;
+ case OPTION_NO_ERROR_EXECSTACK:
+ link_info.error_execstack = 0;
+ break;
+ case OPTION_WARN_EXECSTACK_OBJECTS:
+ link_info.warn_execstack = 2;
+ break;
+ case OPTION_WARN_EXECSTACK:
+ link_info.warn_execstack = 1;
+ break;
+ case OPTION_NO_WARN_EXECSTACK:
+ link_info.warn_execstack = 0;
+ break;
+
+ case OPTION_ERROR_RWX_SEGMENTS:
+ link_info.warn_is_error_for_rwx_segments = 1;
+ break;
+ case OPTION_NO_ERROR_RWX_SEGMENTS:
+ link_info.warn_is_error_for_rwx_segments = 0;
+ break;
+ case OPTION_WARN_RWX_SEGMENTS:
+ link_info.no_warn_rwx_segments = 0;
+ link_info.user_warn_rwx_segments = 1;
+ break;
+ case OPTION_NO_WARN_RWX_SEGMENTS:
+ link_info.no_warn_rwx_segments = 1;
+ link_info.user_warn_rwx_segments = 1;
+ break;
+
case 'e':
lang_add_entry (optarg, TRUE);
break;
@@ -2022,6 +2075,43 @@ elf_static_list_options (FILE *file)
-z noexecstack Mark executable as not requiring executable stack\n"));
fprintf (file, _("\
-z globalaudit Mark executable requiring global auditing\n"));
+
+ fprintf (file, _("\
+ --warn-execstack-objects Generate a warning if an object file requests an executable stack\n"));
+#if DEFAULT_LD_WARN_EXECSTACK == 0
+ fprintf (file, _("\
+ --warn-execstack Generate a warning if creating an executable stack\n"));
+#else
+ fprintf (file, _("\
+ --warn-execstack Generate a warning if creating an executable stack (default)\n"));
+#endif
+#if DEFAULT_LD_WARN_EXECSTACK == 0
+ fprintf (file, _("\
+ --no-warn-execstack Do not generate a warning if creating an executable stack (default)\n"));
+#else
+ fprintf (file, _("\
+ --no-warn-execstack Do not generate a warning if creating an executable stack\n"));
+#endif
+ fprintf (file, _("\
+ --error-execstack Turn warnings about executable stacks into errors\n"));
+ fprintf (file, _("\
+ --no-error-execstack Do not turn warnings about executable stacks into errors\n"));
+
+#if DEFAULT_LD_WARN_RWX_SEGMENTS
+ fprintf (file, _("\
+ --warn-rwx-segments Generate a warning if a LOAD segment has RWX permissions (default)\n"));
+ fprintf (file, _("\
+ --no-warn-rwx-segments Do not generate a warning if a LOAD segments has RWX permissions\n"));
+#else
+ fprintf (file, _("\
+ --warn-rwx-segments Generate a warning if a LOAD segment has RWX permissions\n"));
+ fprintf (file, _("\
+ --no-warn-rwx-segments Do not generate a warning if a LOAD segments has RWX permissions (default)\n"));
+#endif
+ fprintf (file, _("\
+ --error-rwx-segments Turn warnings about loadable RWX segments into errors\n"));
+ fprintf (file, _("\
+ --no-error-rwx-segments Do not turn warnings about loadable RWX segments into errors\n"));
}
static void
diff -rupN binutils.orig/ld/testsuite/ld-elf/changelma.d binutils-2.35.2/ld/testsuite/ld-elf/changelma.d
--- binutils.orig/ld/testsuite/ld-elf/changelma.d 2024-10-02 14:07:25.213303109 +0100
+++ binutils-2.35.2/ld/testsuite/ld-elf/changelma.d 2024-10-02 14:11:16.149897895 +0100
@@ -1,5 +1,5 @@
#name: changelma (pr20659)
-#ld: -T changelma.lnk
+#ld: -T changelma.lnk --no-warn-rwx-segments
#objcopy_linked_file: --change-section-lma .dynamic+0x80000000
#readelf: -l --wide
#xfail: rx-*-*
diff -rupN binutils.orig/ld/testsuite/ld-elf/commonpage2.d binutils-2.35.2/ld/testsuite/ld-elf/commonpage2.d
--- binutils.orig/ld/testsuite/ld-elf/commonpage2.d 2024-10-02 14:07:25.207303093 +0100
+++ binutils-2.35.2/ld/testsuite/ld-elf/commonpage2.d 2024-10-02 14:11:16.149897895 +0100
@@ -1,6 +1,6 @@
#source: maxpage1.s
#as: --32
-#ld: -z max-page-size=0x200000 -z common-page-size=0x100000 -T maxpage4.t
+#ld: -z max-page-size=0x200000 -z common-page-size=0x100000 -T maxpage4.t --no-warn-rwx-segments
#readelf: -l --wide
#target: x86_64-*-linux*
diff -rupN binutils.orig/ld/testsuite/ld-elf/eh4.d binutils-2.35.2/ld/testsuite/ld-elf/eh4.d
--- binutils.orig/ld/testsuite/ld-elf/eh4.d 2024-10-02 14:07:25.214303111 +0100
+++ binutils-2.35.2/ld/testsuite/ld-elf/eh4.d 2024-10-02 14:11:16.149897895 +0100
@@ -1,7 +1,7 @@
#source: eh4.s
#source: eh4a.s
#as: --64
-#ld: -melf_x86_64 -shared -Ttext 0x400 -z max-page-size=0x200000 -z noseparate-code
+#ld: -melf_x86_64 -shared -Ttext 0x400 -z max-page-size=0x200000 -z noseparate-code -z noexecstack
#readelf: -wf
#target: x86_64-*-*
diff -rupN binutils.orig/ld/testsuite/ld-elf/elf.exp binutils-2.35.2/ld/testsuite/ld-elf/elf.exp
--- binutils.orig/ld/testsuite/ld-elf/elf.exp 2024-10-02 14:07:25.218303122 +0100
+++ binutils-2.35.2/ld/testsuite/ld-elf/elf.exp 2024-10-02 14:11:16.149897895 +0100
@@ -153,12 +153,45 @@ if { [check_gc_sections_available] && ![
}
}
+proc target_defaults_to_execstack {} {
+ global base_dir
+
+ # If the linker has been configured with --enable-default-execstack=no then
+ # this proc should always return 0.
+ if { [file exists $base_dir/config.status] } {
+ set status [remote_exec host grep "enable-default-execstack=no" $base_dir/config.status]
+ if { [lindex $status 0] == 0 } {
+ return 0
+ } else {
+ verbose -log "$base_dir/config.status does not contain enable-default-execstack=no"
+ }
+ } else {
+ verbose -log "there is no file $base_dir/config.status"
+ }
+
+ if { [istarget "aarch64*-*-*"]
+ || [istarget "arc*-*-*"]
+ || [istarget "cris*-*-*"]
+ || [istarget "ia64*-*-*"]
+ || [istarget "kvx*-*-*"]
+ || [istarget "loongarch*-*-*"]
+ || [istarget "nios2*-*-*"]
+ || [istarget "powerpc64*-*-*"]
+ || [istarget "pru*-*-*"]
+ || [istarget "riscv*-*-*"]
+ || [istarget "tilegx*-*-*"]
+ || [istarget "tilepro*-*-*"] } {
+ return 0
+ }
+ return 1
+}
+
if { [istarget *-*-*linux*]
|| [istarget *-*-nacl*]
|| [istarget *-*-gnu*] } {
run_ld_link_tests [list \
[list "stack exec" \
- "-z execstack" \
+ "-z execstack --no-error-execstack" \
"" \
"" \
{stack.s} \
@@ -172,7 +205,7 @@ if { [istarget *-*-*linux*]
{{readelf {-Wl} stack-noexec.rd}} \
"stack-noexec.exe"] \
[list "stack size" \
- "-z stack-size=0x123400" \
+ "-z stack-size=0x123400 -z noexecstack" \
"" \
"" \
{stack.s} \
@@ -186,6 +219,95 @@ if { [istarget *-*-*linux*]
[list [list "readelf" {-Wl} $pr23900_1_exp]] \
"pr23900-1.exe"] \
]
+
+ # Test the linker's generation of execstack and executable segment warnings.
+ # Since these are normally pruned from the linker's output we temporarily
+ # disable tha action here.
+ rename prune_warnings_extra old_prune_warnings_extra
+ proc prune_warnings_extra { text } {
+ return $text
+ }
+
+ set curr_ldflags $LDFLAGS
+ if { [istarget powerpc*-*-*] && ![istarget powerpc64*-*-*] } {
+ # Don't generate an executable .plt section
+ set LDFLAGS "$LDFLAGS --secure-plt"
+ }
+
+ # Since the warnings can be disabled by configure, ensure consistency
+ # of the first test by forcing the flags.
+ run_ld_link_tests [list \
+ [list "PR ld/29072 (warn about an executable .note.GNU-stack)" \
+ "-e 0 --warn-execstack --warn-rwx-segments --no-error-rwx-segments --no-error-execstack" \
+ "" \
+ "" \
+ {pr29072-a.s} \
+ {{ld pr29072.a.warn}} \
+ "pr29072-a.exe"] \
+ [list "PR 29072 (warn about -z execstack)" \
+ "-z execstack --warn-execstack --no-error-execstack" \
+ "" \
+ "" \
+ {stack.s} \
+ {{ld pr29072.c.warn}} \
+ "pr29072-c.exe"] \
+ [list "PR ld/29072 (suppress warnings about executable stack)" \
+ "-e 0 --no-warn-execstack" \
+ "" \
+ "" \
+ {pr29072-a.s} \
+ {} \
+ "pr29072-d.exe"] \
+ [list "Ensure that a warning issued when creating a segment with RWX permissions" \
+ "-e 0 -Tnobits-1.t --warn-rwx-segments --no-error-rwx-segments" \
+ "" \
+ "" \
+ {nobits-1.s} \
+ {{ld rwx-segments-1.l}} \
+ "rwx-segments-1.exe"] \
+ [list "Ensure that a warning issued when creating a TLS segment with execute permission" \
+ "-e 0 -T rwx-segments-2.t --warn-rwx-segments --no-error-rwx-segments" \
+ "" \
+ "" \
+ {size-2.s} \
+ {{ld rwx-segments-2.l}} \
+ "rwx-segments-2.exe"] \
+ [list "Ensure that the RWX warning can be suppressed" \
+ "-e 0 -Tnobits-1.t --no-warn-rwx-segments" \
+ "" \
+ "" \
+ {nobits-1.s} \
+ {} \
+ "rwx-segments-3.exe"] \
+ ]
+
+ set LDFLAGS $curr_ldflags
+
+ if { [target_defaults_to_execstack] } {
+ run_ld_link_tests [list \
+ [list "PR ld/29072 (warn about absent .note.GNU-stack)" \
+ "-e 0 -z stack-size=0x123400 --warn-execstack --no-error-execstack" \
+ "" \
+ "" \
+ {pr29072-b.s} \
+ {{ld pr29072.b.warn}} \
+ "pr29072-b.exe"] \
+ ]
+ } else {
+ run_ld_link_tests [list \
+ [list "PR ld/29072 (ignore absent .note.GNU-stack)" \
+ "-e 0 -z stack-size=0x123400 --no-error-execstack" \
+ "" \
+ "" \
+ {pr29072-b.s} \
+ {} \
+ "pr29072-b.exe"] \
+ ]
+ }
+
+ # Restore the normal pruning behaviour.
+ rename prune_warnings_extra ""
+ rename old_prune_warnings_extra prune_warnings_extra
}
if [check_gc_sections_available] {
@@ -277,7 +399,7 @@ set array_tests_static {
}
# NetBSD ELF systems do not currently support the .*_array sections.
-set xfails "*-*-netbsdelf*"
+set xfails "*-*-netbsd*"
run_ld_link_exec_tests $array_tests $xfails
if { [istarget *-*-linux*]
@@ -338,7 +460,7 @@ if { [istarget *-*-linux*]
run_ld_link_exec_tests [list \
[list \
"Run mbind2a" \
- "$NOPIE_LDFLAGS -Wl,-z,common-page-size=0x4000" \
+ "$NOPIE_LDFLAGS -Wl,-z,common-page-size=0x4000 -Wl,-z,noexecstack" \
"" \
{ mbind2a.s mbind2b.c } \
"mbind2a" \
@@ -347,7 +469,7 @@ if { [istarget *-*-linux*]
] \
[list \
"Run mbind2b" \
- "-static -Wl,-z,common-page-size=0x4000" \
+ "-static -Wl,-z,common-page-size=0x4000 -Wl,-z,noexecstack" \
"" \
{ mbind2a.s mbind2b.c } \
"mbind2b" \
diff -rupN binutils.orig/ld/testsuite/ld-elf/flags1.d binutils-2.35.2/ld/testsuite/ld-elf/flags1.d
--- binutils.orig/ld/testsuite/ld-elf/flags1.d 2024-10-02 14:07:25.209303098 +0100
+++ binutils-2.35.2/ld/testsuite/ld-elf/flags1.d 2024-10-02 14:11:16.149897895 +0100
@@ -1,5 +1,5 @@
#name: --set-section-flags test 1 (sections)
-#ld: -Tflags1.ld
+#ld: -Tflags1.ld --no-warn-rwx-segments
#objcopy_linked_file: --set-section-flags .post_text_reserve=contents,alloc,load,readonly,code
#readelf: -S --wide
diff -rupN binutils.orig/ld/testsuite/ld-elf/header.d binutils-2.35.2/ld/testsuite/ld-elf/header.d
--- binutils.orig/ld/testsuite/ld-elf/header.d 2024-10-02 14:07:25.208303096 +0100
+++ binutils-2.35.2/ld/testsuite/ld-elf/header.d 2024-10-02 14:11:16.149897895 +0100
@@ -1,5 +1,5 @@
# target: *-*-linux* *-*-gnu* *-*-vxworks arm*-*-uclinuxfdpiceabi
-# ld: -T header.t -z max-page-size=0x100
+# ld: -T header.t -z max-page-size=0x100 -z common-page-size=0x100 --no-warn-rwx-segments
# objdump: -hpw
#...
diff -rupN binutils.orig/ld/testsuite/ld-elf/linux-x86.exp binutils-2.35.2/ld/testsuite/ld-elf/linux-x86.exp
--- binutils.orig/ld/testsuite/ld-elf/linux-x86.exp 2024-10-02 14:07:25.209303098 +0100
+++ binutils-2.35.2/ld/testsuite/ld-elf/linux-x86.exp 2024-10-02 14:11:16.149897895 +0100
@@ -51,12 +51,12 @@ run_ld_link_tests [list \
run_ld_link_exec_tests [list \
[list \
"Run PR ld/23428 test" \
- "--no-dynamic-linker -z separate-code" \
+ "--no-dynamic-linker -z separate-code -z noexecstack" \
"" \
{ linux-x86.S pr23428.c dummy.s } \
"pr23428" \
"pass.out" \
- "$NOPIE_CFLAGS $NOSANTIZE_CFLAGS -fno-asynchronous-unwind-tables" \
+ "$NOPIE_CFLAGS -fno-asynchronous-unwind-tables" \
"asm" \
] \
]
@@ -142,7 +142,7 @@ proc check_pr25749a {testname srcfilea s
run_cc_link_tests [list \
[list \
"Build $testname ($ldflags $cflags)" \
- "$ldflags tmpdir/pr25749-bin.o" \
+ "$ldflags tmpdir/pr25749-bin.o -z noexecstack" \
"$cflags -I../bfd" \
[list $srcfilea $srcfileb]\
{{readelf {-Wr} pr25749.rd}} \
@@ -152,7 +152,7 @@ proc check_pr25749a {testname srcfilea s
run_ld_link_exec_tests [list \
[list \
"Run ${testname}a ($ldflags $cflags)" \
- "$ldflags tmpdir/pr25749-bin.o" \
+ "$ldflags tmpdir/pr25749-bin.o -z noexecstack" \
"" \
[list $srcfilea $srcfileb]\
"${testname}a" \
@@ -164,7 +164,7 @@ proc check_pr25749a {testname srcfilea s
run_cc_link_tests [list \
[list \
"Build $testname ($ldflags $cflags)" \
- "$ldflags tmpdir/pr25749-bin.o" \
+ "$ldflags tmpdir/pr25749-bin.o -z noexecstack" \
"$cflags -I../bfd" \
[list $srcfilea $srcfileb]\
[list [list error_output $lderror]] \
@@ -245,7 +245,7 @@ proc check_pr25749b {testname srcfilea s
run_cc_link_tests [list \
[list \
"Build lib${testname}.so ($dsoldflags)" \
- "-shared $dsoldflags tmpdir/pr25749-bin.o" \
+ "-shared $dsoldflags tmpdir/pr25749-bin.o -z noexecstack" \
"-fPIC -I../bfd" \
[list $srcfileb] \
{{readelf {-Wr} pr25749.rd}} \
@@ -261,7 +261,7 @@ proc check_pr25749b {testname srcfilea s
run_ld_link_exec_tests [list \
[list \
"Run ${testname}b ($ldflags $cflags)" \
- "$ldflags -Wl,--no-as-needed tmpdir/lib${testname}.so" \
+ "$ldflags -Wl,--no-as-needed tmpdir/lib${testname}.so -z noexecstack" \
"" \
[list $srcfilea]\
"${testname}b" \
diff -rupN binutils.orig/ld/testsuite/ld-elf/loadaddr1.d binutils-2.35.2/ld/testsuite/ld-elf/loadaddr1.d
--- binutils.orig/ld/testsuite/ld-elf/loadaddr1.d 2024-10-02 14:07:25.211303103 +0100
+++ binutils-2.35.2/ld/testsuite/ld-elf/loadaddr1.d 2024-10-02 14:11:16.149897895 +0100
@@ -1,5 +1,5 @@
#source: loadaddr.s
-#ld: -T loadaddr1.t -T loadaddr.t -z max-page-size=0x200000 -z noseparate-code
+#ld: -T loadaddr1.t -T loadaddr.t -z max-page-size=0x200000 -z noseparate-code --no-warn-rwx-segments
#readelf: -l --wide
#target: *-*-linux* *-*-gnu* arm*-*-uclinuxfdpiceabi
#xfail: h8300-*-* rx-*-linux*
diff -rupN binutils.orig/ld/testsuite/ld-elf/loadaddr2.d binutils-2.35.2/ld/testsuite/ld-elf/loadaddr2.d
--- binutils.orig/ld/testsuite/ld-elf/loadaddr2.d 2024-10-02 14:07:25.212303106 +0100
+++ binutils-2.35.2/ld/testsuite/ld-elf/loadaddr2.d 2024-10-02 14:11:16.150897898 +0100
@@ -1,5 +1,5 @@
#source: loadaddr.s
-#ld: -T loadaddr2.t -T loadaddr.t -z max-page-size=0x200000 -z noseparate-code
+#ld: -T loadaddr2.t -T loadaddr.t -z max-page-size=0x200000 -z noseparate-code --no-warn-rwx-segments
#readelf: -l --wide
#target: *-*-linux* *-*-gnu* arm*-*-uclinuxfdpiceabi
#xfail: h8300-*-* rx-*-linux*
diff -rupN binutils.orig/ld/testsuite/ld-elf/maxpage4.d binutils-2.35.2/ld/testsuite/ld-elf/maxpage4.d
--- binutils.orig/ld/testsuite/ld-elf/maxpage4.d 2024-10-02 14:07:25.215303114 +0100
+++ binutils-2.35.2/ld/testsuite/ld-elf/maxpage4.d 2024-10-02 14:11:16.150897898 +0100
@@ -1,6 +1,6 @@
#source: maxpage1.s
#as: --32
-#ld: -z max-page-size=0x200000 -T maxpage4.t
+#ld: -z max-page-size=0x200000 -T maxpage4.t --no-warn-rwx-segments
#readelf: -l --wide
#target: x86_64-*-linux* i?86-*-linux-gnu i?86-*-gnu*
diff -rupN binutils.orig/ld/testsuite/ld-elf/maxpage5.d binutils-2.35.2/ld/testsuite/ld-elf/maxpage5.d
--- binutils.orig/ld/testsuite/ld-elf/maxpage5.d 2024-10-02 14:07:25.217303119 +0100
+++ binutils-2.35.2/ld/testsuite/ld-elf/maxpage5.d 2024-10-02 14:11:16.150897898 +0100
@@ -1,6 +1,6 @@
#source: maxpage5.s
#as: --32
-#ld: -z max-page-size=0x200000 -T maxpage5.t
+#ld: -z max-page-size=0x200000 -T maxpage5.t --no-warn-rwx-segments
#objcopy_linked_file: -R .foo
#readelf: -l --wide
#target: x86_64-*-linux* i?86-*-linux-gnu i?86-*-gnu*
diff -rupN binutils.orig/ld/testsuite/ld-elf/nobits-1.d binutils-2.35.2/ld/testsuite/ld-elf/nobits-1.d
--- binutils.orig/ld/testsuite/ld-elf/nobits-1.d 2024-10-02 14:07:25.217303119 +0100
+++ binutils-2.35.2/ld/testsuite/ld-elf/nobits-1.d 2024-10-02 14:11:16.150897898 +0100
@@ -1,4 +1,4 @@
-#ld: -Tnobits-1.t
+#ld: -Tnobits-1.t --no-warn-rwx-segments
#readelf: -l --wide
#...
diff -rupN binutils.orig/ld/testsuite/ld-elf/note-1.d binutils-2.35.2/ld/testsuite/ld-elf/note-1.d
--- binutils.orig/ld/testsuite/ld-elf/note-1.d 2024-10-02 14:07:25.217303119 +0100
+++ binutils-2.35.2/ld/testsuite/ld-elf/note-1.d 2024-10-02 14:11:16.150897898 +0100
@@ -1,4 +1,4 @@
-#ld: -Tnote-1.t
+#ld: -Tnote-1.t --no-warn-rwx-segments
#readelf: -l --wide
#...
diff -rupN binutils.orig/ld/testsuite/ld-elf/note-2.d binutils-2.35.2/ld/testsuite/ld-elf/note-2.d
--- binutils.orig/ld/testsuite/ld-elf/note-2.d 2024-10-02 14:07:25.212303106 +0100
+++ binutils-2.35.2/ld/testsuite/ld-elf/note-2.d 2024-10-02 14:11:16.150897898 +0100
@@ -1,4 +1,4 @@
-#ld: -Tnote-2.t
+#ld: -Tnote-2.t --no-warn-rwx-segments
#objcopy_linked_file: -R .foo
#readelf: -l --wide
diff -rupN binutils.orig/ld/testsuite/ld-elf/orphan-10.d binutils-2.35.2/ld/testsuite/ld-elf/orphan-10.d
--- binutils.orig/ld/testsuite/ld-elf/orphan-10.d 2024-10-02 14:07:25.212303106 +0100
+++ binutils-2.35.2/ld/testsuite/ld-elf/orphan-10.d 2024-10-02 14:11:16.150897898 +0100
@@ -1,5 +1,5 @@
#source: orphan-10.s
-#ld: -N -T orphan-9.ld
+#ld: -N -T orphan-9.ld --no-warn-rwx-segments
#objdump: -h
#xfail: [uses_genelf]
diff -rupN binutils.orig/ld/testsuite/ld-elf/orphan-11.d binutils-2.35.2/ld/testsuite/ld-elf/orphan-11.d
--- binutils.orig/ld/testsuite/ld-elf/orphan-11.d 2024-10-02 14:07:25.207303093 +0100
+++ binutils-2.35.2/ld/testsuite/ld-elf/orphan-11.d 2024-10-02 14:11:16.150897898 +0100
@@ -1,5 +1,5 @@
#source: orphan-11.s
-#ld: -T orphan-11.ld --orphan-handling=error
+#ld: -T orphan-11.ld --orphan-handling=error --no-warn-rwx-segments
#objdump: -wh
#...
diff -rupN binutils.orig/ld/testsuite/ld-elf/orphan-12.d binutils-2.35.2/ld/testsuite/ld-elf/orphan-12.d
--- binutils.orig/ld/testsuite/ld-elf/orphan-12.d 2024-10-02 14:07:25.209303098 +0100
+++ binutils-2.35.2/ld/testsuite/ld-elf/orphan-12.d 2024-10-02 14:11:16.150897898 +0100
@@ -1,5 +1,5 @@
#source: orphan-12.s
-#ld: -T orphan-11.ld --strip-debug --orphan-handling=error
+#ld: -T orphan-11.ld --strip-debug --orphan-handling=error --no-warn-rwx-segments
#objdump: -wh
#...
diff -rupN binutils.orig/ld/testsuite/ld-elf/orphan-5.d binutils-2.35.2/ld/testsuite/ld-elf/orphan-5.d
--- binutils.orig/ld/testsuite/ld-elf/orphan-5.d 2024-10-02 14:07:25.208303096 +0100
+++ binutils-2.35.2/ld/testsuite/ld-elf/orphan-5.d 2024-10-02 14:11:16.150897898 +0100
@@ -1,4 +1,4 @@
#name: Report warning for orphan sections
-#ld: --script orphan.ld --orphan-handling=warn
+#ld: --script orphan.ld --orphan-handling=warn --no-warn-rwx-segments
#source: orphan.s
#warning_output: orphan-5.l
diff -rupN binutils.orig/ld/testsuite/ld-elf/orphan-7.d binutils-2.35.2/ld/testsuite/ld-elf/orphan-7.d
--- binutils.orig/ld/testsuite/ld-elf/orphan-7.d 2024-10-02 14:07:25.218303122 +0100
+++ binutils-2.35.2/ld/testsuite/ld-elf/orphan-7.d 2024-10-02 14:11:16.150897898 +0100
@@ -1,4 +1,4 @@
#name: Discard orphan sections
-#ld: --script orphan.ld --orphan-handling=discard
+#ld: --script orphan.ld --orphan-handling=discard --no-warn-rwx-segments
#source: orphan.s
#map: orphan-7.map
diff -rupN binutils.orig/ld/testsuite/ld-elf/orphan-8.d binutils-2.35.2/ld/testsuite/ld-elf/orphan-8.d
--- binutils.orig/ld/testsuite/ld-elf/orphan-8.d 2024-10-02 14:07:25.211303103 +0100
+++ binutils-2.35.2/ld/testsuite/ld-elf/orphan-8.d 2024-10-02 14:11:16.150897898 +0100
@@ -1,4 +1,4 @@
#name: Place orphan sections
-#ld: --script orphan.ld --orphan-handling=place
+#ld: --script orphan.ld --orphan-handling=place --no-warn-rwx-segments
#source: orphan.s
#map: orphan-8.map
diff -rupN binutils.orig/ld/testsuite/ld-elf/orphan-9.d binutils-2.35.2/ld/testsuite/ld-elf/orphan-9.d
--- binutils.orig/ld/testsuite/ld-elf/orphan-9.d 2024-10-02 14:07:25.216303116 +0100
+++ binutils-2.35.2/ld/testsuite/ld-elf/orphan-9.d 2024-10-02 14:11:16.150897898 +0100
@@ -1,5 +1,5 @@
#source: orphan-9.s
-#ld: -N -T orphan-9.ld
+#ld: -N -T orphan-9.ld --no-warn-rwx-segments
#objdump: -h
#xfail: [uses_genelf]
diff -rupN binutils.orig/ld/testsuite/ld-elf/orphan-region.d binutils-2.35.2/ld/testsuite/ld-elf/orphan-region.d
--- binutils.orig/ld/testsuite/ld-elf/orphan-region.d 2024-10-02 14:07:25.218303122 +0100
+++ binutils-2.35.2/ld/testsuite/ld-elf/orphan-region.d 2024-10-02 14:11:16.150897898 +0100
@@ -1,5 +1,5 @@
#source: orphan-region.s
-#ld: -T orphan-region.ld -N -z stack-size=0
+#ld: -T orphan-region.ld -N -z stack-size=0 --no-warn-rwx-segments
#readelf: -S -l --wide
#xfail: [uses_genelf] hppa*64*-*-* spu-*-* *-*-nacl*
# if not using elf.em, you don't get fancy orphan handling
diff -rupN binutils.orig/ld/testsuite/ld-elf/orphan.d binutils-2.35.2/ld/testsuite/ld-elf/orphan.d
--- binutils.orig/ld/testsuite/ld-elf/orphan.d 2024-10-02 14:07:25.211303103 +0100
+++ binutils-2.35.2/ld/testsuite/ld-elf/orphan.d 2024-10-02 14:11:16.150897898 +0100
@@ -1,5 +1,5 @@
#source: orphan.s
-#ld: -T orphan.ld
+#ld: -T orphan.ld --no-warn-rwx-segments
#readelf: -S --wide
#xfail: [uses_genelf]
# if not using elf.em, you don't get fancy orphan handling
diff -rupN binutils.orig/ld/testsuite/ld-elf/pr19539.d binutils-2.35.2/ld/testsuite/ld-elf/pr19539.d
--- binutils.orig/ld/testsuite/ld-elf/pr19539.d 2024-10-02 14:07:25.217303119 +0100
+++ binutils-2.35.2/ld/testsuite/ld-elf/pr19539.d 2024-10-02 14:11:16.150897898 +0100
@@ -1,6 +1,6 @@
#source: start.s
#source: pr19539.s
-#ld: -pie -T pr19539.t --warn-textrel
+#ld: -pie -T pr19539.t --warn-textrel --no-warn-rwx-segments
#readelf : --dyn-syms --wide
#warning: .*: creating DT_TEXTREL in a PIE
#target: *-*-linux* *-*-gnu* *-*-solaris* arm*-*-uclinuxfdpiceabi
diff -rupN binutils.orig/ld/testsuite/ld-elf/pr29072-a.s binutils-2.35.2/ld/testsuite/ld-elf/pr29072-a.s
--- binutils.orig/ld/testsuite/ld-elf/pr29072-a.s 1970-01-01 01:00:00.000000000 +0100
+++ binutils-2.35.2/ld/testsuite/ld-elf/pr29072-a.s 2024-10-02 14:11:16.150897898 +0100
@@ -0,0 +1,6 @@
+ .text
+ .global main
+main:
+ .nop
+
+ .section .note.GNU-stack,"x",%progbits
diff -rupN binutils.orig/ld/testsuite/ld-elf/pr29072-b.s binutils-2.35.2/ld/testsuite/ld-elf/pr29072-b.s
--- binutils.orig/ld/testsuite/ld-elf/pr29072-b.s 1970-01-01 01:00:00.000000000 +0100
+++ binutils-2.35.2/ld/testsuite/ld-elf/pr29072-b.s 2024-10-02 14:11:16.150897898 +0100
@@ -0,0 +1,5 @@
+ .text
+ .globl foo
+foo:
+ .nop
+
diff -rupN binutils.orig/ld/testsuite/ld-elf/pr29072.a.warn binutils-2.35.2/ld/testsuite/ld-elf/pr29072.a.warn
--- binutils.orig/ld/testsuite/ld-elf/pr29072.a.warn 1970-01-01 01:00:00.000000000 +0100
+++ binutils-2.35.2/ld/testsuite/ld-elf/pr29072.a.warn 2024-10-02 14:11:16.150897898 +0100
@@ -0,0 +1 @@
+.*: warning: .*\.o: requires executable stack \(because the \.note\.GNU-stack section is executable\)
diff -rupN binutils.orig/ld/testsuite/ld-elf/pr29072.b.warn binutils-2.35.2/ld/testsuite/ld-elf/pr29072.b.warn
--- binutils.orig/ld/testsuite/ld-elf/pr29072.b.warn 1970-01-01 01:00:00.000000000 +0100
+++ binutils-2.35.2/ld/testsuite/ld-elf/pr29072.b.warn 2024-10-02 14:11:16.150897898 +0100
@@ -0,0 +1,2 @@
+.*: warning: .*\.o: missing \.note\.GNU-stack section implies executable stack
+.*: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
diff -rupN binutils.orig/ld/testsuite/ld-elf/pr29072.c.warn binutils-2.35.2/ld/testsuite/ld-elf/pr29072.c.warn
--- binutils.orig/ld/testsuite/ld-elf/pr29072.c.warn 1970-01-01 01:00:00.000000000 +0100
+++ binutils-2.35.2/ld/testsuite/ld-elf/pr29072.c.warn 2024-10-02 14:11:16.151897901 +0100
@@ -0,0 +1 @@
+.*: warning: enabling an executable stack because of -z execstack command line option
diff -rupN binutils.orig/ld/testsuite/ld-elf/rwx-segments-1.l binutils-2.35.2/ld/testsuite/ld-elf/rwx-segments-1.l
--- binutils.orig/ld/testsuite/ld-elf/rwx-segments-1.l 1970-01-01 01:00:00.000000000 +0100
+++ binutils-2.35.2/ld/testsuite/ld-elf/rwx-segments-1.l 2024-10-02 14:11:16.151897901 +0100
@@ -0,0 +1 @@
+.*warning: .* has a LOAD segment with RWX permissions
diff -rupN binutils.orig/ld/testsuite/ld-elf/rwx-segments-2.l binutils-2.35.2/ld/testsuite/ld-elf/rwx-segments-2.l
--- binutils.orig/ld/testsuite/ld-elf/rwx-segments-2.l 1970-01-01 01:00:00.000000000 +0100
+++ binutils-2.35.2/ld/testsuite/ld-elf/rwx-segments-2.l 2024-10-02 14:11:16.151897901 +0100
@@ -0,0 +1 @@
+.*: warning: .* has a TLS segment with execute permission
diff -rupN binutils.orig/ld/testsuite/ld-elf/rwx-segments-2.t binutils-2.35.2/ld/testsuite/ld-elf/rwx-segments-2.t
--- binutils.orig/ld/testsuite/ld-elf/rwx-segments-2.t 1970-01-01 01:00:00.000000000 +0100
+++ binutils-2.35.2/ld/testsuite/ld-elf/rwx-segments-2.t 2024-10-02 14:11:16.151897901 +0100
@@ -0,0 +1,20 @@
+PHDRS
+{
+ header PT_PHDR PHDRS ;
+
+ image PT_LOAD FLAGS (5) PHDRS;
+ tls PT_TLS FLAGS (7);
+
+}
+SECTIONS
+{
+ .text 0x100 : { *(.text) } :image
+ .tdata : { *(.tdata) } :image :tls
+ .tbss : { *(.tbss) } :image : tls
+ .map : {
+ LONG (SIZEOF (.text))
+ LONG (SIZEOF (.tdata))
+ LONG (SIZEOF (.tbss))
+ } :image
+ /DISCARD/ : { *(*) }
+}
diff -rupN binutils.orig/ld/testsuite/ld-elf/shared.exp binutils-2.35.2/ld/testsuite/ld-elf/shared.exp
--- binutils.orig/ld/testsuite/ld-elf/shared.exp 2024-10-02 14:07:25.218303122 +0100
+++ binutils-2.35.2/ld/testsuite/ld-elf/shared.exp 2024-10-02 14:11:16.151897901 +0100
@@ -256,13 +256,13 @@ if { [check_gc_sections_available] } {
"pr20828-v.so"] \
[list \
"PR ld/20828 forcibly exported symbol version without section GC" \
- "$LFLAGS --no-dynamic-linker -e foo -E -T pr20828-v.ld" "" "" \
+ "$LFLAGS --no-dynamic-linker -e foo -E -T pr20828-v.ld --no-error-rwx-segments" "" "" \
{pr20828-v.s} \
{{objdump -p pr20828-v.od}} \
"pr20828-v-1"] \
[list \
"PR ld/20828 forcibly exported symbol version with section GC" \
- "$LFLAGS --no-dynamic-linker -e foo --gc-sections -E -T pr20828-v.ld" "" "" \
+ "$LFLAGS --no-dynamic-linker -e foo --gc-sections -E -T pr20828-v.ld --no-error-rwx-segments" "" "" \
{pr20828-v.s} \
{{objdump -p pr20828-v.od}} \
"pr20828-v-2"]]
@@ -279,7 +279,7 @@ if { [check_gc_sections_available] } {
[list \
"PR ld/21233 dynamic symbols with section GC\
(auxiliary shared library)" \
- "$LFLAGS -shared -T pr21233.ld" "" "$AFLAGS_PIC" \
+ "$LFLAGS -shared -T pr21233.ld --no-error-rwx-segments" "" "$AFLAGS_PIC" \
{pr21233-l.s} \
{{readelf --dyn-syms pr21233-l.sd}} \
"libpr21233.so"]]
@@ -287,7 +287,7 @@ if { [check_gc_sections_available] } {
run_ld_link_tests [list \
[list \
"PR ld/21233 dynamic symbols with section GC (--undefined)" \
- "$LFLAGS --gc-sections -e foo --undefined=bar -T pr21233.ld" \
+ "$LFLAGS --gc-sections -e foo --undefined=bar -T pr21233.ld --no-error-rwx-segments" \
"tmpdir/libpr21233.so" "" \
{pr21233.s} \
{{readelf --dyn-syms pr21233.sd}} \
@@ -297,7 +297,7 @@ if { [check_gc_sections_available] } {
[list \
"PR ld/21233 dynamic symbols with section GC (--require-defined)" \
"$LFLAGS --gc-sections -e foo --require-defined=bar\
- -T pr21233.ld" \
+ -T pr21233.ld --no-error-rwx-segments" \
"tmpdir/libpr21233.so" "" \
{pr21233.s} \
{{readelf --dyn-syms pr21233.sd}} \
@@ -306,7 +306,7 @@ if { [check_gc_sections_available] } {
run_ld_link_tests [list \
[list \
"PR ld/21233 dynamic symbols with section GC (EXTERN)" \
- "$LFLAGS --gc-sections -e foo -T pr21233-e.ld" \
+ "$LFLAGS --gc-sections -e foo -T pr21233-e.ld --no-error-rwx-segments" \
"tmpdir/libpr21233.so" "" \
{pr21233.s} \
{{readelf --dyn-syms pr21233.sd}} \
@@ -796,7 +796,7 @@ set build_tests {
if { ![istarget alpha-*-*] } {
append build_tests {
{"Build pr19073a.o"
- "-r -nostdlib" ""
+ "-r -nostdlib -z noexecstack" ""
{pr19073.s} {} "pr19073a.o"}
{"Build libpr19073.so"
"-shared -Wl,--version-script=pr19073.map tmpdir/pr19073a.o" "-fPIC"
diff -rupN binutils.orig/ld/testsuite/ld-elf/size-1.d binutils-2.35.2/ld/testsuite/ld-elf/size-1.d
--- binutils.orig/ld/testsuite/ld-elf/size-1.d 2024-10-02 14:07:25.208303096 +0100
+++ binutils-2.35.2/ld/testsuite/ld-elf/size-1.d 2024-10-02 14:11:16.151897901 +0100
@@ -1,5 +1,5 @@
#source: size-1.s
-#ld: -T size-1.t
+#ld: -T size-1.t --no-warn-rwx-segments
#objdump: -s
# v850 .tdata/.tbss are not TLS sections
#xfail: v850*-*-*
diff -rupN binutils.orig/ld/testsuite/ld-elf/textaddr7.d binutils-2.35.2/ld/testsuite/ld-elf/textaddr7.d
--- binutils.orig/ld/testsuite/ld-elf/textaddr7.d 2024-10-02 14:07:25.216303116 +0100
+++ binutils-2.35.2/ld/testsuite/ld-elf/textaddr7.d 2024-10-02 14:11:16.151897901 +0100
@@ -1,5 +1,5 @@
#source: maxpage1.s
-#ld: -n -z max-page-size=0x200000 -Ttext-segment 0x10000
+#ld: -n -z max-page-size=0x200000 -Ttext-segment 0x10000 --no-warn-rwx-segments
#readelf: -l --wide
#target: *-*-linux-gnu *-*-gnu* arm*-*-uclinuxfdpiceabi
diff -rupN binutils.orig/ld/testsuite/ld-elf/warn1.d binutils-2.35.2/ld/testsuite/ld-elf/warn1.d
--- binutils.orig/ld/testsuite/ld-elf/warn1.d 2024-10-02 14:07:25.218303122 +0100
+++ binutils-2.35.2/ld/testsuite/ld-elf/warn1.d 2024-10-02 14:11:16.151897901 +0100
@@ -1,7 +1,7 @@
#source: start.s
#source: symbol1ref.s
#source: symbol1w.s
-#ld: -T group.ld
+#ld: -T group.ld --no-warn-rwx-segments
#warning: ^[^\n]*\): warning: witty one-liner$
#readelf: -s
#xfail: [is_generic]
diff -rupN binutils.orig/ld/testsuite/ld-elf/warn2.d binutils-2.35.2/ld/testsuite/ld-elf/warn2.d
--- binutils.orig/ld/testsuite/ld-elf/warn2.d 2024-10-02 14:07:25.218303122 +0100
+++ binutils-2.35.2/ld/testsuite/ld-elf/warn2.d 2024-10-02 14:11:16.151897901 +0100
@@ -1,7 +1,7 @@
#source: start.s
#source: symbol2ref.s
#source: symbol2w.s
-#ld: -T group.ld
+#ld: -T group.ld --no-warn-rwx-segments
#warning: ^[^\n]*\.[obj]+: warning: function 'Foo' used$
#readelf: -s
# if not using elf.em, you don't get fancy section handling
diff -rupN binutils.orig/ld/testsuite/ld-i386/discarded1.d binutils-2.35.2/ld/testsuite/ld-i386/discarded1.d
--- binutils.orig/ld/testsuite/ld-i386/discarded1.d 2024-10-02 14:07:25.226303142 +0100
+++ binutils-2.35.2/ld/testsuite/ld-i386/discarded1.d 2024-10-02 14:11:16.151897901 +0100
@@ -1,3 +1,3 @@
#as: --32
-#ld: -melf_i386 -T discarded1.t
+#ld: -melf_i386 -T discarded1.t --no-error-rwx-segments
#error: .*discarded output section: `.got.plt'
diff -rupN binutils.orig/ld/testsuite/ld-i386/i386.exp binutils-2.35.2/ld/testsuite/ld-i386/i386.exp
--- binutils.orig/ld/testsuite/ld-i386/i386.exp 2024-10-02 14:07:25.227303145 +0100
+++ binutils-2.35.2/ld/testsuite/ld-i386/i386.exp 2024-10-02 14:11:16.151897901 +0100
@@ -773,7 +773,8 @@ if { [isnative]
] \
[list \
"Build gotpc1" \
- "$NOPIE_LDFLAGS -Wl,--as-needed tmpdir/gotpc1.o tmpdir/got1d.so" \
+ "$NOPIE_LDFLAGS -Wl,--as-needed,-z,noexecstack \
+ tmpdir/gotpc1.o tmpdir/got1d.so" \
"-Wa,-mx86-used-note=no" \
{ dummy.s } \
{{objdump {-dw} got1.dd}} \
@@ -950,7 +951,8 @@ if { [isnative]
] \
[list \
"Build property-6" \
- "-Wl,--as-needed tmpdir/property-6.o tmpdir/property-6.so" \
+ "-Wl,--as-needed,-z,noexecstack \
+ tmpdir/property-6.o tmpdir/property-6.so" \
"-Wa,-mx86-used-note=no" \
{ dummy.s } \
{{readelf {-n} property-2.r}} \
diff -rupN binutils.orig/ld/testsuite/ld-i386/pr19175.d binutils-2.35.2/ld/testsuite/ld-i386/pr19175.d
--- binutils.orig/ld/testsuite/ld-i386/pr19175.d 2024-10-02 14:07:25.221303129 +0100
+++ binutils-2.35.2/ld/testsuite/ld-i386/pr19175.d 2024-10-02 14:11:16.151897901 +0100
@@ -1,6 +1,6 @@
#source: pr19175.s
#as: --32 -mrelax-relocations=yes
-#ld: -Bsymbolic -shared -melf_i386 -T pr19175.t
+#ld: -Bsymbolic -shared -melf_i386 -T pr19175.t --no-error-rwx-segments
#objdump: -dw
.*: +file format .*
diff -rupN binutils.orig/ld/testsuite/ld-i386/pr19539.d binutils-2.35.2/ld/testsuite/ld-i386/pr19539.d
--- binutils.orig/ld/testsuite/ld-i386/pr19539.d 2024-10-02 14:07:25.226303142 +0100
+++ binutils-2.35.2/ld/testsuite/ld-i386/pr19539.d 2024-10-02 14:11:16.151897901 +0100
@@ -1,5 +1,5 @@
#as: --32
-#ld: -pie -m elf_i386 -T pr19539.t -z notext
+#ld: -pie -m elf_i386 -T pr19539.t -z notext --no-error-rwx-segments
#readelf: -r --wide
Relocation section '.rel.dyn' at offset 0x[0-9a-f]+ contains 1 entry:
diff -rupN binutils.orig/ld/testsuite/ld-i386/pr23189.d binutils-2.35.2/ld/testsuite/ld-i386/pr23189.d
--- binutils.orig/ld/testsuite/ld-i386/pr23189.d 2024-10-02 14:07:25.224303137 +0100
+++ binutils-2.35.2/ld/testsuite/ld-i386/pr23189.d 2024-10-02 14:11:16.151897901 +0100
@@ -1,5 +1,5 @@
#as: --32 -mrelax-relocations=yes
-#ld: -shared -melf_i386 -T pr23189.t
+#ld: -shared -melf_i386 -T pr23189.t --no-error-rwx-segments
#readelf: -r --wide
There are no relocations in this file.
diff -rupN binutils.orig/ld/testsuite/ld-plugin/lto-3r.d binutils-2.35.2/ld/testsuite/ld-plugin/lto-3r.d
--- binutils.orig/ld/testsuite/ld-plugin/lto-3r.d 2024-10-02 14:07:25.149302944 +0100
+++ binutils-2.35.2/ld/testsuite/ld-plugin/lto-3r.d 2024-10-02 14:11:16.152897903 +0100
@@ -1,4 +1,4 @@
-#ld: -r tmpdir/lto-3b.o
+#ld: -r tmpdir/lto-3b.o --no-error-execstack
#source: dummy.s
#nm: -p
diff -rupN binutils.orig/ld/testsuite/ld-plugin/lto-5r.d binutils-2.35.2/ld/testsuite/ld-plugin/lto-5r.d
--- binutils.orig/ld/testsuite/ld-plugin/lto-5r.d 2024-10-02 14:07:25.149302944 +0100
+++ binutils-2.35.2/ld/testsuite/ld-plugin/lto-5r.d 2024-10-02 14:11:16.152897903 +0100
@@ -1,4 +1,4 @@
-#ld: -r tmpdir/lto-5a.o tmpdir/lto-5b.o
+#ld: -r tmpdir/lto-5a.o tmpdir/lto-5b.o --no-error-execstack
#source: dummy.s
#nm: -p
diff -rupN binutils.orig/ld/testsuite/ld-plugin/lto.exp binutils-2.35.2/ld/testsuite/ld-plugin/lto.exp
--- binutils.orig/ld/testsuite/ld-plugin/lto.exp 2024-10-02 14:07:25.152302952 +0100
+++ binutils-2.35.2/ld/testsuite/ld-plugin/lto.exp 2024-10-02 14:11:16.152897903 +0100
@@ -140,7 +140,7 @@ set lto_link_tests [list \
"" "-flto -O2 $lto_fat $NOSANTIZE_CFLAGS" \
{pr12758b.c} {} "libpr12758.a"] \
[list "PR ld/12758" \
- "$NOPIE_LDFLAGS -O2 -Wl,-e,foo -nostdlib -flto -fuse-linker-plugin tmpdir/pr12758a.o -Wl,--start-group tmpdir/libpr12758.a -Wl,--end-group" \
+ "$NOPIE_LDFLAGS -O2 -Wl,-e,foo -nostdlib -flto -fuse-linker-plugin tmpdir/pr12758a.o -Wl,--start-group tmpdir/libpr12758.a -Wl,--end-group -Wl,--no-error-execstack" \
"$NOSANTIZE_CFLAGS" \
{dummy.c} {} "pr12758.exe"] \
[list "Build libpr13183.a" \
@@ -681,7 +681,7 @@ run_cc_link_tests $lto_link_symbol_tests
run_ld_link_tests [list \
[list "PR ld/19317 (2)" \
- "-r tmpdir/pr19317.o" "" "" \
+ "-r tmpdir/pr19317.o --no-error-execstack" "" "" \
{dummy.s} {} "pr19317-r.o"] \
]
diff -rupN binutils.orig/ld/testsuite/ld-powerpc/ppc476-shared.d binutils-2.35.2/ld/testsuite/ld-powerpc/ppc476-shared.d
--- binutils.orig/ld/testsuite/ld-powerpc/ppc476-shared.d 2024-10-02 14:07:25.158302967 +0100
+++ binutils-2.35.2/ld/testsuite/ld-powerpc/ppc476-shared.d 2024-10-02 14:11:16.152897903 +0100
@@ -1,6 +1,6 @@
#source: ppc476-shared.s
#as: -a32
-#ld: -melf32ppc -q -shared -z common-page-size=0x10000 --ppc476-workaround -T ppc476-shared.lnk
+#ld: -melf32ppc -q -shared -z common-page-size=0x10000 -z notext --ppc476-workaround -T ppc476-shared.lnk --no-error-rwx-segments
#objdump: -dr
#target: powerpc*-*-*
diff -rupN binutils.orig/ld/testsuite/ld-powerpc/ppc476-shared2.d binutils-2.35.2/ld/testsuite/ld-powerpc/ppc476-shared2.d
--- binutils.orig/ld/testsuite/ld-powerpc/ppc476-shared2.d 2024-10-02 14:07:25.155302959 +0100
+++ binutils-2.35.2/ld/testsuite/ld-powerpc/ppc476-shared2.d 2024-10-02 14:11:16.152897903 +0100
@@ -1,13 +1,13 @@
#source: ppc476-shared.s
#as: -a32
-#ld: -melf32ppc -shared -z common-page-size=0x10000 --ppc476-workaround -T ppc476-shared.lnk
+#ld: -melf32ppc -shared -z common-page-size=0x10000 -z notext --ppc476-workaround -T ppc476-shared.lnk --no-error-rwx-segments
#objdump: -R
#target: powerpc*-*-*
.*: file format .*
DYNAMIC RELOCATION RECORDS
-OFFSET TYPE VALUE
+OFFSET +TYPE +VALUE
0001000[02] R_PPC_ADDR16_LO \.text\+0x00050000
0002000[02] R_PPC_ADDR16_LO \.text\+0x00050000
0003000[02] R_PPC_ADDR16_LO \.text\+0x00050000
diff -rupN binutils.orig/ld/testsuite/ld-s390/s390.exp binutils-2.35.2/ld/testsuite/ld-s390/s390.exp
--- binutils.orig/ld/testsuite/ld-s390/s390.exp 2024-10-02 14:07:25.123302877 +0100
+++ binutils-2.35.2/ld/testsuite/ld-s390/s390.exp 2024-10-02 14:11:16.152897903 +0100
@@ -81,7 +81,7 @@ set s390xtests {
{{objdump -dzrj.text gotreloc_64-relro-1.dd}}
"gotreloc_64-1"}
{"PLT: offset test"
- "-shared -m elf64_s390 -dT pltoffset-1.ld" ""
+ "-shared -m elf64_s390 -dT pltoffset-1.ld --no-error-rwx-segments" ""
"-m64" {pltoffset-1.s}
{{objdump "-dzrj.text --stop-address=16" pltoffset-1.dd}}
"pltoffset-1"}
diff -rupN binutils.orig/ld/testsuite/ld-scripts/align2a.d binutils-2.35.2/ld/testsuite/ld-scripts/align2a.d
--- binutils.orig/ld/testsuite/ld-scripts/align2a.d 2024-10-02 14:07:25.133302903 +0100
+++ binutils-2.35.2/ld/testsuite/ld-scripts/align2a.d 2024-10-02 14:11:16.152897903 +0100
@@ -1,4 +1,4 @@
-# ld: --defsym data_align=16 -T align2.t
+# ld: --defsym data_align=16 -T align2.t --no-error-rwx-segments
# objdump: --section-headers
[^:]+: +file format.*
diff -rupN binutils.orig/ld/testsuite/ld-scripts/align2b.d binutils-2.35.2/ld/testsuite/ld-scripts/align2b.d
--- binutils.orig/ld/testsuite/ld-scripts/align2b.d 2024-10-02 14:07:25.130302895 +0100
+++ binutils-2.35.2/ld/testsuite/ld-scripts/align2b.d 2024-10-02 14:11:16.152897903 +0100
@@ -1,4 +1,4 @@
-# ld: --defsym data_align=32 -T align2.t
+# ld: --defsym data_align=32 -T align2.t --no-error-rwx-segments
# objdump: --section-headers
[^:]+: +file +format.*
diff -rupN binutils.orig/ld/testsuite/ld-scripts/align5.d binutils-2.35.2/ld/testsuite/ld-scripts/align5.d
--- binutils.orig/ld/testsuite/ld-scripts/align5.d 2024-10-02 14:07:25.133302903 +0100
+++ binutils-2.35.2/ld/testsuite/ld-scripts/align5.d 2024-10-02 14:11:16.152897903 +0100
@@ -1,7 +1,7 @@
# source: align2a.s
-# ld: -T align5.t
+# ld: -T align5.t --no-error-rwx-segments
# nm: -n
#...
.*foo
-#...
\ No newline at end of file
+#...
diff -rupN binutils.orig/ld/testsuite/ld-scripts/alignof.exp binutils-2.35.2/ld/testsuite/ld-scripts/alignof.exp
--- binutils.orig/ld/testsuite/ld-scripts/alignof.exp 2024-10-02 14:07:25.130302895 +0100
+++ binutils-2.35.2/ld/testsuite/ld-scripts/alignof.exp 2024-10-02 14:11:16.152897903 +0100
@@ -32,7 +32,14 @@ if ![ld_assemble $as $srcdir/$subdir/ali
return
}
-if ![ld_link $ld tmpdir/alignof "-T $srcdir/$subdir/alignof.t tmpdir/alignof.o"] {
+if { [is_pecoff_format] } {
+ set IMAGE_BASE "--image-base 0"
+} else {
+ set IMAGE_BASE ""
+}
+
+if ![ld_link $ld tmpdir/alignof "-T $srcdir/$subdir/alignof.t \
+ $IMAGE_BASE tmpdir/alignof.o --no-error-rwx-segments"] {
fail $testname
return
}
diff -rupN binutils.orig/ld/testsuite/ld-scripts/crossref.exp binutils-2.35.2/ld/testsuite/ld-scripts/crossref.exp
--- binutils.orig/ld/testsuite/ld-scripts/crossref.exp 2024-10-02 14:07:25.135302908 +0100
+++ binutils-2.35.2/ld/testsuite/ld-scripts/crossref.exp 2024-10-02 14:11:16.152897903 +0100
@@ -82,7 +82,7 @@ if [istarget arc*-*-elf32] {
# IA64 has both ordered and unordered sections in an input file.
setup_xfail ia64-*-*
-set exec_output [run_host_cmd "$ld" "$flags -o tmpdir/cross1 -T $srcdir/$subdir/cross1.t tmpdir/cross1.o tmpdir/cross2.o"]
+set exec_output [run_host_cmd "$ld" "$flags -o tmpdir/cross1 -T $srcdir/$subdir/cross1.t tmpdir/cross1.o tmpdir/cross2.o --no-error-rwx-segments"]
set exec_output [prune_warnings $exec_output]
@@ -108,7 +108,7 @@ if { ![ld_compile $CC "$srcdir/$subdir/c
return
}
-set exec_output [run_host_cmd "$ld" "$flags -o tmpdir/cross2 -T $srcdir/$subdir/cross2.t tmpdir/cross3.o"]
+set exec_output [run_host_cmd "$ld" "$flags -o tmpdir/cross2 -T $srcdir/$subdir/cross2.t tmpdir/cross3.o --no-error-rwx-segments"]
set exec_output [prune_warnings $exec_output]
regsub -all "(^|\n)($ld: warning: cannot find entry symbol\[^\n\]*\n?)" $exec_output "\\1" exec_output
@@ -140,7 +140,7 @@ if ![ld_relocate $ld tmpdir/cross3-parti
return
}
-set exec_output [run_host_cmd "$ld" "$flags -o tmpdir/cross3 -T $srcdir/$subdir/cross3.t tmpdir/cross3-partial.o tmpdir/cross2.o"]
+set exec_output [run_host_cmd "$ld" "$flags -o tmpdir/cross3 -T $srcdir/$subdir/cross3.t tmpdir/cross3-partial.o tmpdir/cross2.o --no-error-rwx-segments"]
set exec_output [prune_warnings $exec_output]
@@ -155,7 +155,7 @@ if [string match "" $exec_output] then {
fail $test3
}
-set exec_output [run_host_cmd "$ld" "$flags -o tmpdir/cross4 -T $srcdir/$subdir/cross4.t tmpdir/cross4.o"]
+set exec_output [run_host_cmd "$ld" "$flags -o tmpdir/cross4 -T $srcdir/$subdir/cross4.t tmpdir/cross4.o --no-error-rwx-segments"]
set exec_output [prune_warnings $exec_output]
regsub -all "(^|\n)($ld: warning: cannot find entry symbol\[^\n\]*\n?)" $exec_output "\\1" exec_output
@@ -167,7 +167,7 @@ if [string match "" $exec_output] then {
fail $test4
}
-set exec_output [run_host_cmd "$ld" "$flags -o tmpdir/cross5 -T $srcdir/$subdir/cross5.t tmpdir/cross4.o"]
+set exec_output [run_host_cmd "$ld" "$flags -o tmpdir/cross5 -T $srcdir/$subdir/cross5.t tmpdir/cross4.o --no-error-rwx-segments"]
set exec_output [prune_warnings $exec_output]
regsub -all "(^|\n)($ld: warning: cannot find entry symbol\[^\n\]*\n?)" $exec_output "\\1" exec_output
@@ -183,7 +183,7 @@ if [string match "" $exec_output] then {
}
}
-set exec_output [run_host_cmd "$ld" "$flags -o tmpdir/cross6 -T $srcdir/$subdir/cross6.t tmpdir/cross3.o"]
+set exec_output [run_host_cmd "$ld" "$flags -o tmpdir/cross6 -T $srcdir/$subdir/cross6.t tmpdir/cross3.o --no-error-rwx-segments"]
set exec_output [prune_warnings $exec_output]
regsub -all "(^|\n)($ld: warning: cannot find entry symbol\[^\n\]*\n?)" $exec_output "\\1" exec_output
@@ -197,7 +197,7 @@ if [string match "" $exec_output] then {
fail $test6
}
-set exec_output [run_host_cmd "$ld" "$flags -o tmpdir/cross7 -T $srcdir/$subdir/cross7.t tmpdir/cross3.o"]
+set exec_output [run_host_cmd "$ld" "$flags -o tmpdir/cross7 -T $srcdir/$subdir/cross7.t tmpdir/cross3.o --no-error-rwx-segments"]
set exec_output [prune_warnings $exec_output]
regsub -all "(^|\n)($ld: warning: cannot find entry symbol\[^\n\]*\n?)" $exec_output "\\1" exec_output
diff -rupN binutils.orig/ld/testsuite/ld-scripts/defined2.d binutils-2.35.2/ld/testsuite/ld-scripts/defined2.d
--- binutils.orig/ld/testsuite/ld-scripts/defined2.d 2024-10-02 14:07:25.132302900 +0100
+++ binutils-2.35.2/ld/testsuite/ld-scripts/defined2.d 2024-10-02 14:11:16.152897903 +0100
@@ -1,4 +1,4 @@
-#ld: -Tdefined2.t
+#ld: -Tdefined2.t --no-error-rwx-segments
#nm: -B
#source: phdrs.s
diff -rupN binutils.orig/ld/testsuite/ld-scripts/defined3.d binutils-2.35.2/ld/testsuite/ld-scripts/defined3.d
--- binutils.orig/ld/testsuite/ld-scripts/defined3.d 2024-10-02 14:07:25.131302897 +0100
+++ binutils-2.35.2/ld/testsuite/ld-scripts/defined3.d 2024-10-02 14:11:16.152897903 +0100
@@ -1,4 +1,4 @@
-#ld: -Tdefined3.t
+#ld: -Tdefined3.t --no-error-rwx-segments
#nm: -B
#source: phdrs.s
#source: defined.s
diff -rupN binutils.orig/ld/testsuite/ld-scripts/defined5.d binutils-2.35.2/ld/testsuite/ld-scripts/defined5.d
--- binutils.orig/ld/testsuite/ld-scripts/defined5.d 2024-10-02 14:07:25.134302905 +0100
+++ binutils-2.35.2/ld/testsuite/ld-scripts/defined5.d 2024-10-02 14:11:16.152897903 +0100
@@ -1,4 +1,4 @@
-#ld: -Tdefined5.t
+#ld: -Tdefined5.t --no-error-rwx-segments
#nm: -B
#source: defined5.s
#xfail: powerpc*-*-aix* rs6000-*-aix*
diff -rupN binutils.orig/ld/testsuite/ld-scripts/pr14962.d binutils-2.35.2/ld/testsuite/ld-scripts/pr14962.d
--- binutils.orig/ld/testsuite/ld-scripts/pr14962.d 2024-10-02 14:07:25.134302905 +0100
+++ binutils-2.35.2/ld/testsuite/ld-scripts/pr14962.d 2024-10-02 14:11:16.152897903 +0100
@@ -1,4 +1,4 @@
-#ld: -Ttext=0x1000 -Tdata=0x2000 -T pr14962.t
+#ld: -Ttext=0x1000 -Tdata=0x2000 -T pr14962.t --no-error-rwx-segments
#source: pr14962a.s
#source: pr14962b.s
#nm: -n
diff -rupN binutils.orig/ld/testsuite/ld-scripts/pr18963.d binutils-2.35.2/ld/testsuite/ld-scripts/pr18963.d
--- binutils.orig/ld/testsuite/ld-scripts/pr18963.d 2024-10-02 14:07:25.129302892 +0100
+++ binutils-2.35.2/ld/testsuite/ld-scripts/pr18963.d 2024-10-02 14:11:16.153897905 +0100
@@ -1,5 +1,5 @@
# source: data.s
-# ld: -T pr18963.t
+# ld: -T pr18963.t --no-error-rwx-segments
# nm: -B -n
# notarget: *-*-aix* *-*-vms
# Skip on AIX targets because they require non-empty sections.
diff -rupN binutils.orig/ld/testsuite/ld-scripts/pr20302.d binutils-2.35.2/ld/testsuite/ld-scripts/pr20302.d
--- binutils.orig/ld/testsuite/ld-scripts/pr20302.d 2024-10-02 14:07:25.134302905 +0100
+++ binutils-2.35.2/ld/testsuite/ld-scripts/pr20302.d 2024-10-02 14:11:16.153897905 +0100
@@ -1,4 +1,4 @@
-#ld: -Tdata=0x1000 -Tdata=0x2000 -Tcross2.t
+#ld: -Tdata=0x1000 -Tdata=0x2000 -Tcross2.t --no-error-rwx-segments
#source: align2a.s
#objdump: -h
#notarget: *-*-*aout *-*-netbsd *-*-vms ns32k-*-* rx-*-* x86_64-*-cygwin
diff -rupN binutils.orig/ld/testsuite/ld-scripts/print-memory-usage.exp binutils-2.35.2/ld/testsuite/ld-scripts/print-memory-usage.exp
--- binutils.orig/ld/testsuite/ld-scripts/print-memory-usage.exp 2024-10-02 14:07:25.132302900 +0100
+++ binutils-2.35.2/ld/testsuite/ld-scripts/print-memory-usage.exp 2024-10-02 14:11:16.153897905 +0100
@@ -47,7 +47,7 @@ run_ld_link_tests {
{
"print-memory-usage-2"
- "-T print-memory-usage-2.t --print-memory-usage"
+ "-T print-memory-usage-2.t --print-memory-usage --no-error-rwx-segments"
""
""
{ "print-memory-usage-1.s" }
diff -rupN binutils.orig/ld/testsuite/ld-scripts/rgn-at1.d binutils-2.35.2/ld/testsuite/ld-scripts/rgn-at1.d
--- binutils.orig/ld/testsuite/ld-scripts/rgn-at1.d 2024-10-02 14:07:25.130302895 +0100
+++ binutils-2.35.2/ld/testsuite/ld-scripts/rgn-at1.d 2024-10-02 14:11:16.153897905 +0100
@@ -1,6 +1,6 @@
# name: rgn-at1
# source: rgn-at.s
-# ld: -T rgn-at1.t
+# ld: -T rgn-at1.t --no-error-rwx-segments
# objdump: -w -h
# xfail: rx-*-*
# FAILS on the RX because the linker has to set LMA == VMA for the
diff -rupN binutils.orig/ld/testsuite/ld-scripts/rgn-at10.d binutils-2.35.2/ld/testsuite/ld-scripts/rgn-at10.d
--- binutils.orig/ld/testsuite/ld-scripts/rgn-at10.d 2024-10-02 14:07:25.130302895 +0100
+++ binutils-2.35.2/ld/testsuite/ld-scripts/rgn-at10.d 2024-10-02 14:11:16.153897905 +0100
@@ -1,7 +1,7 @@
#source: rgn-at10.s
-#ld: -T rgn-at10.t
+#ld: -T rgn-at10.t --no-error-rwx-segments
#objdump: -h --wide
-#xfail: hppa*64*-*-hpux*
+#xfail: hppa*64*-*-hpux* v850*-*-*
# Test that lma is adjusted in case the section start vma is aligned and
# lma_region != region if requested by script. Make sure this works with
# non-load sections.
diff -rupN binutils.orig/ld/testsuite/ld-scripts/rgn-at4.d binutils-2.35.2/ld/testsuite/ld-scripts/rgn-at4.d
--- binutils.orig/ld/testsuite/ld-scripts/rgn-at4.d 2024-10-02 14:07:25.130302895 +0100
+++ binutils-2.35.2/ld/testsuite/ld-scripts/rgn-at4.d 2024-10-02 14:11:16.153897905 +0100
@@ -1,6 +1,6 @@
# name: rgn-at4
# source: rgn-at.s
-# ld: -T rgn-at4.t
+# ld: -T rgn-at4.t --no-error-rwx-segments
# objdump: -w -h
# xfail: rx-*-*
# FAILS on the RX because the linker has to set LMA == VMA for the
diff -rupN binutils.orig/ld/testsuite/ld-scripts/rgn-at6.d binutils-2.35.2/ld/testsuite/ld-scripts/rgn-at6.d
--- binutils.orig/ld/testsuite/ld-scripts/rgn-at6.d 2024-10-02 14:07:25.133302903 +0100
+++ binutils-2.35.2/ld/testsuite/ld-scripts/rgn-at6.d 2024-10-02 14:11:16.153897905 +0100
@@ -1,5 +1,5 @@
#source: rgn-at6.s
-#ld: -T rgn-at6.t
+#ld: -T rgn-at6.t --no-error-rwx-segments
#objdump: -h --wide
# Test that lma is aligned as for vma when lma_region==region.
diff -rupN binutils.orig/ld/testsuite/ld-scripts/rgn-at8.d binutils-2.35.2/ld/testsuite/ld-scripts/rgn-at8.d
--- binutils.orig/ld/testsuite/ld-scripts/rgn-at8.d 2024-10-02 14:07:25.132302900 +0100
+++ binutils-2.35.2/ld/testsuite/ld-scripts/rgn-at8.d 2024-10-02 14:11:16.153897905 +0100
@@ -1,5 +1,5 @@
#source: rgn-at6.s
-#ld: -T rgn-at8.t
+#ld: -T rgn-at8.t --no-error-rwx-segments
#objdump: -h --wide
# Test that lma is aligned when lma_region!=region and requested by script.
diff -rupN binutils.orig/ld/testsuite/ld-scripts/rgn-at9.d binutils-2.35.2/ld/testsuite/ld-scripts/rgn-at9.d
--- binutils.orig/ld/testsuite/ld-scripts/rgn-at9.d 2024-10-02 14:07:25.128302890 +0100
+++ binutils-2.35.2/ld/testsuite/ld-scripts/rgn-at9.d 2024-10-02 14:11:16.153897905 +0100
@@ -1,5 +1,5 @@
#source: rgn-at6.s
-#ld: -T rgn-at9.t
+#ld: -T rgn-at9.t --no-error-rwx-segments
#objdump: -h --wide
#xfail: rx-*-*
# Test that lma is adjusted in case the section start vma is aligned and
diff -rupN binutils.orig/ld/testsuite/ld-scripts/rgn-over1.d binutils-2.35.2/ld/testsuite/ld-scripts/rgn-over1.d
--- binutils.orig/ld/testsuite/ld-scripts/rgn-over1.d 2024-10-02 14:07:25.133302903 +0100
+++ binutils-2.35.2/ld/testsuite/ld-scripts/rgn-over1.d 2024-10-02 14:11:16.153897905 +0100
@@ -1,6 +1,6 @@
# name: rgn-over1
# source: rgn-over.s
-# ld: -T rgn-over1.t -Map tmpdir/rgn-over1.map
+# ld: -T rgn-over1.t -Map tmpdir/rgn-over1.map --no-error-rwx-segments
# error: \A[^ \n]*?ld[^:\n]*?: [^\n]*?section \`.text' will not fit in region `r1'\n[^ \n]*?ld[^:\n]*?: region `r1' overflowed by 16 bytes\Z
#...
diff -rupN binutils.orig/ld/testsuite/ld-scripts/rgn-over2.d binutils-2.35.2/ld/testsuite/ld-scripts/rgn-over2.d
--- binutils.orig/ld/testsuite/ld-scripts/rgn-over2.d 2024-10-02 14:07:25.129302892 +0100
+++ binutils-2.35.2/ld/testsuite/ld-scripts/rgn-over2.d 2024-10-02 14:11:16.153897905 +0100
@@ -1,6 +1,6 @@
# name: rgn-over2
# source: rgn-over.s
-# ld: -T rgn-over2.t -Map tmpdir/rgn-over2.map
+# ld: -T rgn-over2.t -Map tmpdir/rgn-over2.map --no-error-rwx-segments
# error: \A[^ \n]*?ld[^:\n]*?: [^\n]*?section `\.data' will not fit in region `r1'\n[^ \n]*?ld[^:\n]*?: region `r1' overflowed by 4 bytes\Z
#...
diff -rupN binutils.orig/ld/testsuite/ld-scripts/rgn-over4.d binutils-2.35.2/ld/testsuite/ld-scripts/rgn-over4.d
--- binutils.orig/ld/testsuite/ld-scripts/rgn-over4.d 2024-10-02 14:07:25.133302903 +0100
+++ binutils-2.35.2/ld/testsuite/ld-scripts/rgn-over4.d 2024-10-02 14:11:16.153897905 +0100
@@ -1,6 +1,6 @@
# name: rgn-over4
# source: rgn-over.s
-# ld: -T rgn-over4.t -Map tmpdir/rgn-over4.map
+# ld: -T rgn-over4.t -Map tmpdir/rgn-over4.map --no-error-rwx-segments
# error: \A[^ \n]*?ld[^:\n]*?: [^:\n]*?section `\.text' will not fit in region `r1'\n[^ \n]*?ld[^:\n]*?: region `r1' overflowed by 16 bytes\Z
#...
diff -rupN binutils.orig/ld/testsuite/ld-scripts/rgn-over5.d binutils-2.35.2/ld/testsuite/ld-scripts/rgn-over5.d
--- binutils.orig/ld/testsuite/ld-scripts/rgn-over5.d 2024-10-02 14:07:25.131302897 +0100
+++ binutils-2.35.2/ld/testsuite/ld-scripts/rgn-over5.d 2024-10-02 14:11:16.153897905 +0100
@@ -1,6 +1,6 @@
# name: rgn-over5
# source: rgn-over.s
-# ld: -T rgn-over5.t -Map tmpdir/rgn-over5.map
+# ld: -T rgn-over5.t -Map tmpdir/rgn-over5.map --no-error-rwx-segments
# error: \A[^ \n]*?ld[^:\n]*?: [^\n]*?section `\.text' will not fit in region `v1'\n[^ \n]*?ld[^:\n]*?: region `v1' overflowed by 16 bytes\Z
#...
diff -rupN binutils.orig/ld/testsuite/ld-scripts/rgn-over6.d binutils-2.35.2/ld/testsuite/ld-scripts/rgn-over6.d
--- binutils.orig/ld/testsuite/ld-scripts/rgn-over6.d 2024-10-02 14:07:25.132302900 +0100
+++ binutils-2.35.2/ld/testsuite/ld-scripts/rgn-over6.d 2024-10-02 14:11:16.153897905 +0100
@@ -1,6 +1,6 @@
# name: rgn-over6
# source: rgn-over.s
-# ld: -T rgn-over6.t -Map tmpdir/rgn-over6.map
+# ld: -T rgn-over6.t -Map tmpdir/rgn-over6.map --no-error-rwx-segments
# error: \A[^ \n]*?ld[^:\n]*?: [^\n]*?section `\.text' will not fit in region `r1'\n[^ \n]*?ld[^:\n]*?: [^\n]*?section `\.text' will not fit in region `v1'\n[^ \n]*?ld[^:\n]*?: region `r1' overflowed by 16 bytes\n[^ \n]*?ld[^:\n]*?: region `v1' overflowed by 16 bytes\Z
#...
diff -rupN binutils.orig/ld/testsuite/ld-scripts/script.exp binutils-2.35.2/ld/testsuite/ld-scripts/script.exp
--- binutils.orig/ld/testsuite/ld-scripts/script.exp 2024-10-02 14:07:25.129302892 +0100
+++ binutils-2.35.2/ld/testsuite/ld-scripts/script.exp 2024-10-02 14:11:16.153897905 +0100
@@ -192,7 +192,7 @@ if {[istarget "*-*-pe*"] \
set flags "--image-base 0"
}
-if ![ld_link $ld tmpdir/script "$flags -T $srcdir/$subdir/script.t tmpdir/script.o"] {
+if ![ld_link $ld tmpdir/script "$flags -T $srcdir/$subdir/script.t tmpdir/script.o --no-error-rwx-segments"] {
fail $testname
} else {
check_script
@@ -200,7 +200,7 @@ if ![ld_link $ld tmpdir/script "$flags -
set testname "MRI script"
-if ![ld_link $ld tmpdir/script "$flags -c $srcdir/$subdir/scriptm.t"] {
+if ![ld_link $ld tmpdir/script "$flags -c $srcdir/$subdir/scriptm.t --no-error-rwx-segments"] {
fail $testname
} else {
check_script
diff -rupN binutils.orig/ld/testsuite/ld-scripts/sizeof.exp binutils-2.35.2/ld/testsuite/ld-scripts/sizeof.exp
--- binutils.orig/ld/testsuite/ld-scripts/sizeof.exp 2024-10-02 14:07:25.134302905 +0100
+++ binutils-2.35.2/ld/testsuite/ld-scripts/sizeof.exp 2024-10-02 14:11:16.153897905 +0100
@@ -27,7 +27,8 @@ if ![ld_assemble $as $srcdir/$subdir/siz
return
}
-if ![ld_link $ld tmpdir/sizeof "-T $srcdir/$subdir/sizeof.t tmpdir/sizeof.o"] {
+if ![ld_link $ld tmpdir/sizeof "$LDFLAGS -T $srcdir/$subdir/sizeof.t \
+ $IMAGE_BASE tmpdir/sizeof.o --no-error-rwx-segments"] {
fail $testname
return
}
diff -rupN binutils.orig/ld/testsuite/ld-x86-64/discarded1.d binutils-2.35.2/ld/testsuite/ld-x86-64/discarded1.d
--- binutils.orig/ld/testsuite/ld-x86-64/discarded1.d 2024-10-02 14:07:25.201303078 +0100
+++ binutils-2.35.2/ld/testsuite/ld-x86-64/discarded1.d 2024-10-02 14:11:16.153897905 +0100
@@ -1,3 +1,3 @@
#as: --64
-#ld: -melf_x86_64 -T discarded1.t
+#ld: -melf_x86_64 -T discarded1.t --no-error-rwx-segments
#error: .*discarded output section: `.got.plt'
diff -rupN binutils.orig/ld/testsuite/ld-x86-64/pr19175.d binutils-2.35.2/ld/testsuite/ld-x86-64/pr19175.d
--- binutils.orig/ld/testsuite/ld-x86-64/pr19175.d 2024-10-02 14:07:25.189303047 +0100
+++ binutils-2.35.2/ld/testsuite/ld-x86-64/pr19175.d 2024-10-02 14:11:16.153897905 +0100
@@ -1,6 +1,6 @@
#source: pr19175.s
#as: --64
-#ld: -Bsymbolic -shared -melf_x86_64 -T pr19175.t
+#ld: -Bsymbolic -shared -melf_x86_64 -T pr19175.t --no-error-rwx-segments
#objdump: -dw
.*: +file format .*
diff -rupN binutils.orig/ld/testsuite/ld-x86-64/pr19539a.d binutils-2.35.2/ld/testsuite/ld-x86-64/pr19539a.d
--- binutils.orig/ld/testsuite/ld-x86-64/pr19539a.d 2024-10-02 14:07:25.197303067 +0100
+++ binutils-2.35.2/ld/testsuite/ld-x86-64/pr19539a.d 2024-10-02 14:11:16.153897905 +0100
@@ -1,6 +1,6 @@
#source: pr19539.s
#as: --64
-#ld: -pie -m elf_x86_64 -T pr19539.t -z notext
+#ld: -pie -m elf_x86_64 -T pr19539.t -z notext --no-error-rwx-segments
#readelf: -r --wide
Relocation section '.rela.dyn' at offset 0x[0-9a-f]+ contains 1 entry:
diff -rupN binutils.orig/ld/testsuite/ld-x86-64/pr19539b.d binutils-2.35.2/ld/testsuite/ld-x86-64/pr19539b.d
--- binutils.orig/ld/testsuite/ld-x86-64/pr19539b.d 2024-10-02 14:07:25.194303060 +0100
+++ binutils-2.35.2/ld/testsuite/ld-x86-64/pr19539b.d 2024-10-02 14:11:16.154897908 +0100
@@ -1,6 +1,6 @@
#source: pr19539.s
#as: --x32
-#ld: -pie -m elf32_x86_64 -T pr19539.t -z notext
+#ld: -pie -m elf32_x86_64 -T pr19539.t -z notext --no-error-rwx-segments
#readelf: -r --wide
Relocation section '.rela.dyn' at offset 0x[0-9a-f]+ contains 1 entry:
diff -rupN binutils.orig/ld/testsuite/ld-x86-64/pr23189.d binutils-2.35.2/ld/testsuite/ld-x86-64/pr23189.d
--- binutils.orig/ld/testsuite/ld-x86-64/pr23189.d 2024-10-02 14:07:25.196303065 +0100
+++ binutils-2.35.2/ld/testsuite/ld-x86-64/pr23189.d 2024-10-02 14:11:16.154897908 +0100
@@ -1,5 +1,5 @@
#as: --64 -mrelax-relocations=yes
-#ld: -shared -melf_x86_64 -T pr23189.t
+#ld: -shared -melf_x86_64 -T pr23189.t --no-error-rwx-segments
#readelf: -r --wide
There are no relocations in this file.