PR20886, looping in ppc64_elf_size_stubs
authorAlan Modra <amodra@gmail.com>
Wed, 30 Nov 2016 05:03:07 +0000 (15:33 +1030)
committerAlan Modra <amodra@gmail.com>
Wed, 30 Nov 2016 05:13:49 +0000 (15:43 +1030)
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.

bfd/ChangeLog
bfd/elf64-ppc.c

index bfacc20fe2b54f07c8028df9e8390f1258f02c17..e804d6ef4b6d4c10b77a024d56b5f32b8db09852 100644 (file)
@@ -1,3 +1,9 @@
+2016-11-30  Alan Modra  <amodra@gmail.com>
+
+       PR ld/20886
+       * elf64-ppc.c (ppc64_elf_size_stubs): Make rawsize max size seen
+       on any pass past STUB_SHRINK_ITER.
+
 2016-11-28  H.J. Lu  <hongjiu.lu@intel.com>
 
        * elflink.c (_bfd_elf_fix_symbol_flags): Hide hidden versioned
index d011303555187db801c6d95bdef7b60877196fa4..5a4bc724cf95aec9189e26254debd299a6e719e2 100644 (file)
@@ -12617,7 +12617,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;