aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2022-01-14 21:55:51 +1030
committerAlan Modra <amodra@gmail.com>2022-01-14 22:02:23 +1030
commitff66e8c5bee8a57b531515342e6126782ea9a651 (patch)
tree7c0905be058c529af36a0638796dadcb73dfab67
parentfd47eb1a302753ddf8e37f5a4918c889cb8c929b (diff)
downloadfsf-binutils-gdb-ff66e8c5bee8a57b531515342e6126782ea9a651.zip
fsf-binutils-gdb-ff66e8c5bee8a57b531515342e6126782ea9a651.tar.gz
fsf-binutils-gdb-ff66e8c5bee8a57b531515342e6126782ea9a651.tar.bz2
PR28751 mbind2a / mbind2b regressions on powerpc*-linux
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.
-rw-r--r--include/bfdlink.h3
-rw-r--r--ld/emultempl/elf.em1
-rw-r--r--ld/ldelf.c11
-rw-r--r--ld/testsuite/ld-elf/elf.exp4
4 files changed, 15 insertions, 4 deletions
diff --git a/include/bfdlink.h b/include/bfdlink.h
index 92e3e32..69fc9d3 100644
--- a/include/bfdlink.h
+++ b/include/bfdlink.h
@@ -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. */
diff --git a/ld/emultempl/elf.em b/ld/emultempl/elf.em
index 5977526..7325872 100644
--- a/ld/emultempl/elf.em
+++ b/ld/emultempl/elf.em
@@ -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="))
{
diff --git a/ld/ldelf.c b/ld/ldelf.c
index 7a1a553..799f779 100644
--- a/ld/ldelf.c
+++ b/ld/ldelf.c
@@ -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. */
diff --git a/ld/testsuite/ld-elf/elf.exp b/ld/testsuite/ld-elf/elf.exp
index 16128c2..119908c 100644
--- a/ld/testsuite/ld-elf/elf.exp
+++ b/ld/testsuite/ld-elf/elf.exp
@@ -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" \