aboutsummaryrefslogtreecommitdiff
path: root/bfd/elf.c
diff options
context:
space:
mode:
authorMichael Matz <matz@suse.de>2021-06-07 15:52:31 +0200
committerMichael Matz <matz@suse.de>2021-06-08 16:30:07 +0200
commit956ea65cd707707c0f725930214cbc781367a831 (patch)
treeb0eca2c74bd5a25875183a4b569b9d0524cc6ad1 /bfd/elf.c
parentc3cfd9eb5ba7b58fae227b539e3a683e76208921 (diff)
downloadgdb-956ea65cd707707c0f725930214cbc781367a831.zip
gdb-956ea65cd707707c0f725930214cbc781367a831.tar.gz
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.
Diffstat (limited to 'bfd/elf.c')
-rw-r--r--bfd/elf.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/bfd/elf.c b/bfd/elf.c
index a4cfaf1..de5abaf 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)