diff options
author | Michael Matz <matz@suse.de> | 2021-06-07 15:52:31 +0200 |
---|---|---|
committer | Michael Matz <matz@suse.de> | 2021-06-08 16:30:07 +0200 |
commit | 956ea65cd707707c0f725930214cbc781367a831 (patch) | |
tree | b0eca2c74bd5a25875183a4b569b9d0524cc6ad1 | |
parent | c3cfd9eb5ba7b58fae227b539e3a683e76208921 (diff) | |
download | fsf-binutils-gdb-956ea65cd707707c0f725930214cbc781367a831.zip fsf-binutils-gdb-956ea65cd707707c0f725930214cbc781367a831.tar.gz fsf-binutils-gdb-956ea65cd707707c0f725930214cbc781367a831.tar.bz2 |
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.
-rw-r--r-- | bfd/elf.c | 5 |
1 files changed, 5 insertions, 0 deletions
@@ -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) |