[binutils-gdb] bfd/elf: Don't read non-existing secondary relocs

Michael Matz matz@sourceware.org
Tue Jun 8 14:46:13 GMT 2021


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=956ea65cd707707c0f725930214cbc781367a831

commit 956ea65cd707707c0f725930214cbc781367a831
Author: Michael Matz <matz@suse.de>
Date:   Mon Jun 7 15:52:31 2021 +0200

    bfd/elf: Don't read non-existing secondary relocs
    
    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.

Diff:
---
 bfd/elf.c | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/bfd/elf.c b/bfd/elf.c
index a4cfaf1512f..de5abafabf0 100644
--- 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)


More information about the Binutils-cvs mailing list