bfd/elf: Don't read non-existing secondary relocs
authorMichael Matz <matz@suse.de>
Mon, 7 Jun 2021 13:52:31 +0000 (15:52 +0200)
committerMichael Matz <matz@suse.de>
Tue, 8 Jun 2021 14:30:07 +0000 (16:30 +0200)
Without this we unconditionally try to slurp in secondary
relocs for each input section, leading to quadratic behaviour
even for strip(1).  On write-out we already used a flag to avoid
this.

So track existence of secondary relocs on read-in as well and
only slurp in when needed.  This still doesn't implement a proper
list of secondary reloc sections, and still would exhibit quadratic
behaviour if most input sections have a secondary reloc section.
But at least on normal input this avoids any slowdown from trying
to handle secondary relocation sections.

bfd/
* elf.c (bfd_section_from_shdr): Set has_secondary_relocs flag.
(_bfd_elf_slurp_secondary_reloc_section): Use it for early-out.

bfd/elf.c

index a4cfaf1512f6b31b68c8f068a7bf10dadfaf62a2..de5abafabf0b888c31a6f1eeeda529c921de467e 100644 (file)
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -2467,6 +2467,8 @@ bfd_section_from_shdr (bfd *abfd, unsigned int shindex)
                     "for section %pA found - ignoring"),
                   abfd, name, target_sect);
              }
+           else
+             esdt->has_secondary_relocs = true;
            goto success;
          }
 
@@ -12739,6 +12741,9 @@ _bfd_elf_slurp_secondary_reloc_section (bfd *       abfd,
 #endif
     r_sym = elf32_r_sym;
   
+  if (!elf_section_data (sec)->has_secondary_relocs)
+    return true;
+
   /* Discover if there are any secondary reloc sections
      associated with SEC.  */
   for (relsec = abfd->sections; relsec != NULL; relsec = relsec->next)