diff options
author | Alan Modra <amodra@gmail.com> | 2023-06-07 14:16:06 +0930 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2023-06-07 14:16:06 +0930 |
commit | ba75d1c55cb42114e3bb5c8abe37e5c2bd657a02 (patch) | |
tree | 7e5342433baeaf8305f7a9b08ab58cfc521b4dd4 /bfd/elf.c | |
parent | 0a22a8f27df7d092620dfa1f0135a2dd7b44528a (diff) | |
download | gdb-ba75d1c55cb42114e3bb5c8abe37e5c2bd657a02.zip gdb-ba75d1c55cb42114e3bb5c8abe37e5c2bd657a02.tar.gz gdb-ba75d1c55cb42114e3bb5c8abe37e5c2bd657a02.tar.bz2 |
_bfd_free_cached_info
doc/bfdint.texi and comments in the aout and som code about this
function are just wrong, and its name is not very apt. Better would
be _bfd_mostly_destroy, and we certainly should not be saying anything
about the possibility of later recreating anything lost by this
function. What's more, if _bfd_free_cached_info is called when
creating an archive map to reduce memory usage by throwing away
symbols, the target _close_and_cleanup function won't have access to
tdata or section bfd_user_data to tidy memory. This means most of the
target _close_and_cleanup function won't do anything, and therefore
sometimes will result in memory leaks.
This patch fixes the documentation problems and moves most of the
target _close_and_cleanup code to target _bfd_free_cached_info.
Another notable change is that bfd_generic_bfd_free_cached_info is now
defined as _bfd_free_cached_info rather than _bfd_bool_bfd_true,
ie. the default now frees objalloc memory.
Diffstat (limited to 'bfd/elf.c')
-rw-r--r-- | bfd/elf.c | 15 |
1 files changed, 8 insertions, 7 deletions
@@ -9589,21 +9589,22 @@ _bfd_elf_validate_reloc (bfd *abfd, arelent *areloc) } bool -_bfd_elf_close_and_cleanup (bfd *abfd) +_bfd_elf_free_cached_info (bfd *abfd) { - struct elf_obj_tdata *tdata = elf_tdata (abfd); - if (tdata != NULL - && (bfd_get_format (abfd) == bfd_object - || bfd_get_format (abfd) == bfd_core)) + struct elf_obj_tdata *tdata; + + if ((bfd_get_format (abfd) == bfd_object + || bfd_get_format (abfd) == bfd_core) + && (tdata = elf_tdata (abfd)) != NULL) { - if (elf_tdata (abfd)->o != NULL && elf_shstrtab (abfd) != NULL) + if (tdata->o != NULL && elf_shstrtab (abfd) != NULL) _bfd_elf_strtab_free (elf_shstrtab (abfd)); _bfd_dwarf2_cleanup_debug_info (abfd, &tdata->dwarf2_find_line_info); _bfd_dwarf1_cleanup_debug_info (abfd, &tdata->dwarf1_find_line_info); _bfd_stab_cleanup (abfd, &tdata->line_info); } - return _bfd_generic_close_and_cleanup (abfd); + return _bfd_generic_bfd_free_cached_info (abfd); } /* For Rel targets, we encode meaningful data for BFD_RELOC_VTABLE_ENTRY |