diff options
author | Alan Modra <amodra@gmail.com> | 2023-06-08 19:55:55 +0930 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2023-06-09 12:56:12 +0930 |
commit | ce3ab55fa72dd8778f5fd5fea7d6389af16d141e (patch) | |
tree | 72712c30fe65f06cd6b365231e3596f95db4013e /bfd/libbfd-in.h | |
parent | 8fd82abda0f367f89db50040d519e1464a84c3a0 (diff) | |
download | binutils-ce3ab55fa72dd8778f5fd5fea7d6389af16d141e.zip binutils-ce3ab55fa72dd8778f5fd5fea7d6389af16d141e.tar.gz binutils-ce3ab55fa72dd8778f5fd5fea7d6389af16d141e.tar.bz2 |
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.
Diffstat (limited to 'bfd/libbfd-in.h')
-rw-r--r-- | bfd/libbfd-in.h | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/bfd/libbfd-in.h b/bfd/libbfd-in.h index ae1b61a..03ae099 100644 --- a/bfd/libbfd-in.h +++ b/bfd/libbfd-in.h @@ -787,6 +787,8 @@ struct ecoff_debug_swap; struct ecoff_extr; struct ecoff_find_line; +extern void _bfd_ecoff_free_ecoff_debug_info + (struct ecoff_debug_info *debug); extern bool _bfd_ecoff_locate_line (bfd *, asection *, bfd_vma, struct ecoff_debug_info * const, const struct ecoff_debug_swap * const, struct ecoff_find_line *, |