PR28751 mbind2a / mbind2b regressions on powerpc*-linux
authorAlan Modra <amodra@gmail.com>
Fri, 14 Jan 2022 11:25:51 +0000 (21:55 +1030)
committerAlan Modra <amodra@gmail.com>
Fri, 14 Jan 2022 11:32:23 +0000 (22:02 +1030)
include/
* bfdlink.h (struct bfd_link_info): Add commonpagesize_is_set.
ld/
PR 28751
* emultempl/elf.em (handle_option): Set commonpagesize_is_set.
* ldelf.c (ldelf_after_parse): Don't error when only one of
-z max-page-size or -z common-page-size is given, correct the
other value to make it sane.
* testsuite/ld-elf/elf.exp (mbind2a, mbind2b): Do not pass
-z max-page-size.

include/bfdlink.h
ld/emultempl/elf.em
ld/ldelf.c
ld/testsuite/ld-elf/elf.exp

index 92e3e32360b6c3b9df39f66cc88467993a15f1d9..69fc9d33ff47cc7c00feff689484259863184f7f 100644 (file)
@@ -532,6 +532,9 @@ struct bfd_link_info
   /* TRUE if maxpagesize is set on command-line.  */
   unsigned int maxpagesize_is_set : 1;
 
+  /* TRUE if commonpagesize is set on command-line.  */
+  unsigned int commonpagesize_is_set : 1;
+
   /* Char that may appear as the first char of a symbol, but should be
      skipped (like symbol_leading_char) when looking up symbols in
      wrap_hash.  Used by PowerPC Linux for 'dot' symbols.  */
index 59775260b0620ac5bc2d4d45516f5ac683a3f0df..7325872e1d9e274241c211978b4815a0b2d7bc8c 100644 (file)
@@ -731,6 +731,7 @@ fragment <<EOF
              || (link_info.commonpagesize & (link_info.commonpagesize - 1)) != 0)
            einfo (_("%F%P: invalid common page size \`%s'\n"),
                   optarg + 17);
+         link_info.commonpagesize_is_set = true;
        }
       else if (startswith (optarg, "stack-size="))
        {
index 7a1a553cae7190578de652f6a9bddcb9ead56314..799f779601741fdb6735ade00d78a6b67696e834 100644 (file)
@@ -82,8 +82,15 @@ ldelf_after_parse (void)
 
   after_parse_default ();
   if (link_info.commonpagesize > link_info.maxpagesize)
-    einfo (_("%F%P: common page size (0x%v) > maximum page size (0x%v)\n"),
-          link_info.commonpagesize, link_info.maxpagesize);
+    {
+      if (!link_info.commonpagesize_is_set)
+       link_info.commonpagesize = link_info.maxpagesize;
+      else if (!link_info.maxpagesize_is_set)
+       link_info.maxpagesize = link_info.commonpagesize;
+      else
+       einfo (_("%F%P: common page size (0x%v) > maximum page size (0x%v)\n"),
+              link_info.commonpagesize, link_info.maxpagesize);
+    }
 }
 
 /* Handle the generation of DT_NEEDED tags.  */
index 16128c2989f8b5e364474886a1164beaee4ba5ef..119908cda4e2d03c320f9715b46d93c98f089008 100644 (file)
@@ -365,7 +365,7 @@ if { [istarget *-*-linux*]
     run_ld_link_exec_tests [list \
        [list \
            "Run mbind2a" \
-           "$NOPIE_LDFLAGS -Wl,-z,common-page-size=0x4000,-z,max-page-size=0x4000" \
+           "$NOPIE_LDFLAGS -Wl,-z,common-page-size=0x4000" \
            "" \
            { mbind2a.s mbind2b.c } \
            "mbind2a" \
@@ -374,7 +374,7 @@ if { [istarget *-*-linux*]
        ] \
        [list \
            "Run mbind2b" \
-           "-static -Wl,-z,common-page-size=0x4000,-z,max-page-size=0x4000" \
+           "-static -Wl,-z,common-page-size=0x4000" \
            "" \
            { mbind2a.s mbind2b.c } \
            "mbind2b" \