From ce3ab55fa72dd8778f5fd5fea7d6389af16d141e Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Thu, 8 Jun 2023 19:55:55 +0930 Subject: ecoff find_nearest_line and final link leaks Freeing ecoff_debug_info "pointers to the unswapped symbolic info" isn't a simple matter, due to differing allocation strategies. In _bfd_ecoff_slurp_symbolic_info the pointers are to objalloc memory. In the ecoff linker they are to separately malloc'd memory. In gas we have most (obj-elf) or all (obj-ecoff) into a single malloc'd buffer. This patch fixes the leaks for binutils and ld, leaving the gas leaks for another day. The mips elf backend already had this covered, and the ecoff backend had a pointer, raw_syments used as a flag, so most of the patch is moving these around a little so they are accessible for both ecoff and elf. include/ * coff/ecoff.h (struct ecoff_debug_info): Add alloc_syments. bfd/ * libecoff.h (struct ecoff_tdata): Delete raw_syments. * elfxx-mips.c (free_ecoff_debug): Delete. Replace uses with _bfd_ecoff_free_ecoff_debug_info. (_bfd_mips_elf_final_link): Init debug.alloc_syments. * ecofflink.c (_bfd_ecoff_free_ecoff_debug_info): New function. * ecoff.c (_bfd_ecoff_bfd_free_cached_info): Call _bfd_ecoff_free_ecoff_debug_info. (_bfd_ecoff_slurp_symbolic_info): Replace uses of raw_syments with alloc_syments. (ecoff_final_link_debug_accumulate): Likewise. Use _bfd_ecoff_free_ecoff_debug_info. (_bfd_ecoff_bfd_copy_private_bfd_data): Set alloc_syments for copied output. * elf64-alpha.c (elf64_alpha_read_ecoff_info): Use _bfd_ecoff_free_ecoff_debug_info. * libbfd-in.h (_bfd_ecoff_free_ecoff_debug_info): Declare. * libbfd.h: Regenerate. gas/ * config/obj-ecoff.c (ecoff_frob_file): Set alloc_syments. * config/obj-elf.c (elf_frob_file_after_relocs): Likewise. --- include/coff/ecoff.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'include') diff --git a/include/coff/ecoff.h b/include/coff/ecoff.h index 169d8f6..991d92f 100644 --- a/include/coff/ecoff.h +++ b/include/coff/ecoff.h @@ -299,7 +299,10 @@ struct ecoff_debug_info all pointers to arrays, not single structures. They will be NULL if there are no instances of the relevant structure. These fields are also used by the assembler to output ECOFF debugging - information. */ + information. If alloc_syments is true then the pointers are to + objalloc memory, or into a single malloc'd buffer, or otherwise + should not be freed. */ + bool alloc_syments; unsigned char *line; void *external_dnr; /* struct dnr_ext */ void *external_pdr; /* struct pdr_ext */ -- cgit v1.1