ppc32 and "LOAD segment with RWX permissions"
authorAlan Modra <amodra@gmail.com>
Mon, 6 Feb 2023 02:16:52 +0000 (12:46 +1030)
committerAlan Modra <amodra@gmail.com>
Mon, 6 Feb 2023 12:36:44 +0000 (23:06 +1030)
When using a bss-plt we'll always trigger the RWX warning, which
disturbs gcc test results.  On the other hand, there may be reason to
want the warning when gcc is configured with --enable-secureplt.
So turning off the warning entirely for powerpc might not be the best
solution.  Instead, we'll turn off the warning whenever a bss-plt is
generated, unless the user explicitly asked for the warning.

bfd/
* elf32-ppc.c (ppc_elf_select_plt_layout): Set
no_warn_rwx_segments on generating a bss plt, unless explicity
enabled by the user.  Also show the bss-plt warning when
--warn-rwx-segments is given without --bss-plt.
include/
* bfdlink.h (struct bfd_link_info): Add user_warn_rwx_segments.
ld/
* lexsup.c (parse_args): Set user_warn_rwx_segments.
* testsuite/ld-elf/elf.exp: Pass --secure-plt for powerpc to
the rwx tests.

bfd/elf32-ppc.c
include/bfdlink.h
ld/lexsup.c
ld/testsuite/ld-elf/elf.exp

index a8234f27a8a437b2503cd55c971d5d3acbbf6222..833bc744563f0ec8b406a24d95637e1c0fb3009b 100644 (file)
@@ -4020,12 +4020,19 @@ ppc_elf_select_plt_layout (bfd *output_bfd ATTRIBUTE_UNUSED,
          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);
index 26c459c3815ef0e0f82a7e86438cd7e29a5aa0ce..840790a298c3f8894494c5266b2de0560ceecfd2 100644 (file)
@@ -501,6 +501,9 @@ struct bfd_link_info
   /* 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.  */
+  unsigned int user_warn_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
index c59603855729024853115497249c78c4197e992c..a1c6140100deb12a540f85f810a7d62609d0e8f5 100644 (file)
@@ -936,9 +936,11 @@ parse_args (unsigned argc, char **argv)
          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);
index 1a160d084e04a935ef9352637277c526a6da794f..a4f7f60fefc0684d869c0b30dfda411caed7cf58 100644 (file)
@@ -238,6 +238,12 @@ if {   [istarget *-*-*linux*]
        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 \
@@ -285,6 +291,8 @@ if {   [istarget *-*-*linux*]
            "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)" \