From: Alan Modra Date: Wed, 30 Nov 2016 05:03:07 +0000 (+1030) Subject: PR20886, looping in ppc64_elf_size_stubs X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5d1f2ede8f0de48b90fd18a81f67382dc99661dc;p=thirdparty%2Fbinutils-gdb.git PR20886, looping in ppc64_elf_size_stubs The PR20886 binary is large enough that there are two stub sections servicing .text (which is 88M). It so happens that between one iteration of sizing and the next that one stub section grows while the other shrinks. Since one section is always growing, the loop never terminates. This patch changes the algorithm to not update previous size on shrinking, once we go past a certain number of iterations. PR ld/20886 * elf64-ppc.c (ppc64_elf_size_stubs): Make rawsize max size seen on any pass past STUB_SHRINK_ITER. --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 2eb6f2af740..d8b13c833cb 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2016-11-30 Alan Modra + + PR ld/20886 + * elf64-ppc.c (ppc64_elf_size_stubs): Make rawsize max size seen + on any pass past STUB_SHRINK_ITER. + 2016-10-31 Alan Modra PR 20748 diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c index d2367327f0e..8bebdec69ac 100644 --- a/bfd/elf64-ppc.c +++ b/bfd/elf64-ppc.c @@ -12540,7 +12540,10 @@ ppc64_elf_size_stubs (struct bfd_link_info *info) stub_sec = stub_sec->next) if ((stub_sec->flags & SEC_LINKER_CREATED) == 0) { - stub_sec->rawsize = stub_sec->size; + if (htab->stub_iteration <= STUB_SHRINK_ITER + || stub_sec->rawsize < stub_sec->size) + /* Past STUB_SHRINK_ITER, rawsize is the max size seen. */ + stub_sec->rawsize = stub_sec->size; stub_sec->size = 0; stub_sec->reloc_count = 0; stub_sec->flags &= ~SEC_RELOC;