diff options
author | Alan Modra <amodra@gmail.com> | 2022-01-14 21:55:51 +1030 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2022-01-14 22:02:23 +1030 |
commit | ff66e8c5bee8a57b531515342e6126782ea9a651 (patch) | |
tree | 7c0905be058c529af36a0638796dadcb73dfab67 | |
parent | fd47eb1a302753ddf8e37f5a4918c889cb8c929b (diff) | |
download | fsf-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.h | 3 | ||||
-rw-r--r-- | ld/emultempl/elf.em | 1 | ||||
-rw-r--r-- | ld/ldelf.c | 11 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/elf.exp | 4 |
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=")) { @@ -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" \ |