From 3a8864b3aa87330412f956a6ce233209eba133c8 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Mon, 13 Jan 2025 20:33:54 +1030 Subject: reloc caching This arranges to free section relocs cached in elf_section_data. To do that, some relocs stored there need to use bfd_malloc buffers rather than bfd_alloc ones. * elf.c (_bfd_elf_free_cached_info): Free relocs. * elf32-ppc.c (ppc_elf_relax_section): Realloc relocs rather than malloc, copy, free old. * elf64-ppc.c (get_relocs): bfd_malloc relocs. * elflink.c (_bfd_elf_link_info_read_relocs): Always bfd_malloc relocs. --- bfd/elf32-ppc.c | 25 +++++++------------------ 1 file changed, 7 insertions(+), 18 deletions(-) (limited to 'bfd/elf32-ppc.c') diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c index 25cb31b..f17effd 100644 --- a/bfd/elf32-ppc.c +++ b/bfd/elf32-ppc.c @@ -6629,26 +6629,15 @@ ppc_elf_relax_section (bfd *abfd, { /* Append sufficient NOP relocs so we can write out relocation information for the trampolines. */ - Elf_Internal_Shdr *rel_hdr; - Elf_Internal_Rela *new_relocs = bfd_malloc ((changes + isec->reloc_count) - * sizeof (*new_relocs)); - unsigned ix; - - if (!new_relocs) + size_t old_size = isec->reloc_count * sizeof (*internal_relocs); + size_t extra_size = changes * sizeof (*internal_relocs); + internal_relocs = bfd_realloc (internal_relocs, old_size + extra_size); + elf_section_data (isec)->relocs = internal_relocs; + if (!internal_relocs) goto error_return; - memcpy (new_relocs, internal_relocs, - isec->reloc_count * sizeof (*new_relocs)); - for (ix = changes; ix--;) - { - irel = new_relocs + ix + isec->reloc_count; - - irel->r_info = ELF32_R_INFO (0, R_PPC_NONE); - } - if (internal_relocs != elf_section_data (isec)->relocs) - free (internal_relocs); - elf_section_data (isec)->relocs = new_relocs; + memset ((char *) internal_relocs + old_size, 0, extra_size); isec->reloc_count += changes; - rel_hdr = _bfd_elf_single_rel_hdr (isec); + Elf_Internal_Shdr *rel_hdr = _bfd_elf_single_rel_hdr (isec); rel_hdr->sh_size += changes * rel_hdr->sh_entsize; } else if (elf_section_data (isec)->relocs != internal_relocs) -- cgit v1.1