_bfd_free_cached_info
authorAlan Modra <amodra@gmail.com>
Wed, 7 Jun 2023 04:46:06 +0000 (14:16 +0930)
committerAlan Modra <amodra@gmail.com>
Wed, 7 Jun 2023 04:46:06 +0000 (14:16 +0930)
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.

31 files changed:
bfd/aout-target.h
bfd/aoutx.h
bfd/coff-rs6000.c
bfd/coff64-rs6000.c
bfd/coffcode.h
bfd/coffgen.c
bfd/doc/bfdint.texi
bfd/ecoff.c
bfd/elf-bfd.h
bfd/elf.c
bfd/elf32-mips.c
bfd/elf64-alpha.c
bfd/elf64-ia64-vms.c
bfd/elf64-mips.c
bfd/elf64-ppc.c
bfd/elfn32-mips.c
bfd/elfnn-aarch64.c
bfd/elfxx-mips.c
bfd/elfxx-mips.h
bfd/elfxx-target.h
bfd/libbfd-in.h
bfd/libbfd.h
bfd/libcoff-in.h
bfd/libcoff.h
bfd/libecoff.h
bfd/mach-o-target.c
bfd/mach-o.c
bfd/mach-o.h
bfd/pdp11.c
bfd/som.c
bfd/vms-alpha.c

index 6d2f3c767a23434462ce6bf803477d0afee5d542..7765f5c80d8e7bf506b3dc60a4ac2be50c7a0892 100644 (file)
@@ -598,18 +598,7 @@ MY_bfd_final_link (bfd *abfd, struct bfd_link_info *info)
 #endif
 
 #ifndef MY_close_and_cleanup
-
-/* Handle closing of a BFD including the resource-releasing parts.  */
-
-static bool
-MY_close_and_cleanup (bfd *abfd)
-{
-  if (!MY_bfd_free_cached_info (abfd))
-    return false;
-
-  return _bfd_generic_close_and_cleanup (abfd);
-}
-
+#define MY_close_and_cleanup _bfd_generic_close_and_cleanup
 #endif
 
 #ifndef MY_get_dynamic_symtab_upper_bound
index 6d6527640fe4b7a3df2e4c834757e311f7d26fcd..1a8fd85cf14f9eb6c41b54828dea883763a1bc28 100644 (file)
@@ -2896,35 +2896,33 @@ NAME (aout, sizeof_headers) (bfd *abfd,
   return adata (abfd).exec_bytes_size;
 }
 
-/* Free all information we have cached for this BFD.  We can always
-   read it again later if we need it.  */
+/* Throw away most malloc'd and alloc'd information for this BFD.  */
 
 bool
 NAME (aout, bfd_free_cached_info) (bfd *abfd)
 {
-  asection *o;
-
-  if (bfd_get_format (abfd) != bfd_object
-      || abfd->tdata.aout_data == NULL)
-    return true;
-
+  if ((bfd_get_format (abfd) == bfd_object
+       || bfd_get_format (abfd) == bfd_core)
+      && abfd->tdata.aout_data != NULL)
+    {
 #define BFCI_FREE(x) do { free (x); x = NULL; } while (0)
-  BFCI_FREE (adata (abfd).line_buf);
-  BFCI_FREE (obj_aout_symbols (abfd));
+      BFCI_FREE (adata (abfd).line_buf);
+      BFCI_FREE (obj_aout_symbols (abfd));
 #ifdef USE_MMAP
-  obj_aout_external_syms (abfd) = 0;
-  bfd_free_window (&obj_aout_sym_window (abfd));
-  bfd_free_window (&obj_aout_string_window (abfd));
-  obj_aout_external_strings (abfd) = 0;
+      obj_aout_external_syms (abfd) = 0;
+      bfd_free_window (&obj_aout_sym_window (abfd));
+      bfd_free_window (&obj_aout_string_window (abfd));
+      obj_aout_external_strings (abfd) = 0;
 #else
-  BFCI_FREE (obj_aout_external_syms (abfd));
-  BFCI_FREE (obj_aout_external_strings (abfd));
+      BFCI_FREE (obj_aout_external_syms (abfd));
+      BFCI_FREE (obj_aout_external_strings (abfd));
 #endif
-  for (o = abfd->sections; o != NULL; o = o->next)
-    BFCI_FREE (o->relocation);
+      for (asection *o = abfd->sections; o != NULL; o = o->next)
+       BFCI_FREE (o->relocation);
 #undef BFCI_FREE
+    }
 
-  return true;
+  return _bfd_generic_bfd_free_cached_info (abfd);
 }
 \f
 /* a.out link code.  */
index 421dc8f7ee5f953729ea4c126c708eb217e816ae..271a24fff693e84470dd8a0ad8b3b5d917518e61 100644 (file)
@@ -4436,8 +4436,8 @@ const struct xcoff_dwsect_name xcoff_dwsect_names[] = {
 };
 
 /* For generic entry points.  */
-#define _bfd_xcoff_close_and_cleanup _bfd_coff_close_and_cleanup
-#define _bfd_xcoff_bfd_free_cached_info _bfd_bool_bfd_true
+#define _bfd_xcoff_close_and_cleanup coff_close_and_cleanup
+#define _bfd_xcoff_bfd_free_cached_info coff_bfd_free_cached_info
 #define _bfd_xcoff_new_section_hook coff_new_section_hook
 #define _bfd_xcoff_get_section_contents _bfd_generic_get_section_contents
 #define _bfd_xcoff_get_section_contents_in_window \
index 71d21583ee5dbcd55353434c1428855bd4c47e20..d76c99a3eca3f214e6f7399a8417bbadf43e2703 100644 (file)
@@ -2618,8 +2618,8 @@ const bfd_target rs6000_xcoff64_vec =
     },
 
     /* Generic */
-    _bfd_coff_close_and_cleanup,
-    _bfd_bool_bfd_true,
+    coff_close_and_cleanup,
+    coff_bfd_free_cached_info,
     coff_new_section_hook,
     _bfd_generic_get_section_contents,
     _bfd_generic_get_section_contents_in_window,
@@ -2891,8 +2891,8 @@ const bfd_target rs6000_xcoff64_aix_vec =
     },
 
     /* Generic */
-    _bfd_coff_close_and_cleanup,
-    _bfd_bool_bfd_true,
+    coff_close_and_cleanup,
+    coff_bfd_free_cached_info,
     coff_new_section_hook,
     _bfd_generic_get_section_contents,
     _bfd_generic_get_section_contents_in_window,
index 475627139380595f069f34ed321b786b0fee05e7..62720255b7fb8705e69c2e2318e223c3f8b82ab2 100644 (file)
@@ -5866,11 +5866,11 @@ static const bfd_coff_backend_data bigobj_swap_table =
 #endif /* COFF_WITH_PE_BIGOBJ */
 
 #ifndef coff_close_and_cleanup
-#define coff_close_and_cleanup             _bfd_coff_close_and_cleanup
+#define coff_close_and_cleanup             _bfd_generic_close_and_cleanup
 #endif
 
 #ifndef coff_bfd_free_cached_info
-#define coff_bfd_free_cached_info          _bfd_generic_bfd_free_cached_info
+#define coff_bfd_free_cached_info          _bfd_coff_free_cached_info
 #endif
 
 #ifndef coff_get_section_contents
index afc663c056f821d385ecd92b4c8df2be5f81b1e1..9d45253178e0fcadc7bf60d27cd70ea147148cba 100644 (file)
@@ -3275,43 +3275,37 @@ bfd_coff_group_name (bfd *abfd, const asection *sec)
 }
 
 bool
-_bfd_coff_close_and_cleanup (bfd *abfd)
+_bfd_coff_free_cached_info (bfd *abfd)
 {
-  struct coff_tdata *tdata = coff_data (abfd);
+  struct coff_tdata *tdata;
 
-  if (tdata != NULL)
+  if (bfd_family_coff (abfd)
+      && (bfd_get_format (abfd) == bfd_object
+         || bfd_get_format (abfd) == bfd_core)
+      && (tdata = coff_data (abfd)) != NULL)
     {
-      if (bfd_family_coff (abfd) && bfd_get_format (abfd) == bfd_object)
+      if (tdata->section_by_index)
        {
-         if (tdata->section_by_index)
-           {
-             htab_delete (tdata->section_by_index);
-             tdata->section_by_index = NULL;
-           }
+         htab_delete (tdata->section_by_index);
+         tdata->section_by_index = NULL;
+       }
 
-         if (tdata->section_by_target_index)
-           {
-             htab_delete (tdata->section_by_target_index);
-             tdata->section_by_target_index = NULL;
-           }
+      if (tdata->section_by_target_index)
+       {
+         htab_delete (tdata->section_by_target_index);
+         tdata->section_by_target_index = NULL;
        }
 
+      _bfd_dwarf2_cleanup_debug_info (abfd, &tdata->dwarf2_find_line_info);
+      _bfd_stab_cleanup (abfd, &tdata->line_info);
+
       /* PR 25447:
         Do not clear the keep_syms and keep_strings flags.
         These may have been set by pe_ILF_build_a_bfd() indicating
         that the syms and strings pointers are not to be freed.  */
-      if (bfd_get_format (abfd) == bfd_object
-         && bfd_family_coff (abfd)
-         && !_bfd_coff_free_symbols (abfd))
+      if (!_bfd_coff_free_symbols (abfd))
        return false;
-
-      if (bfd_get_format (abfd) == bfd_object
-         || bfd_get_format (abfd) == bfd_core)
-       {
-         _bfd_dwarf2_cleanup_debug_info (abfd, &tdata->dwarf2_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);
 }
index cb251b1a0d6a63427e32f83ffe7adb3a785e969e..8cf08576c1b74ad86f1b452b1a406479be0ef744 100644 (file)
@@ -493,22 +493,25 @@ functions which don't easily fit into other categories.
 
 @table @samp
 @item _close_and_cleanup
-Free any target specific information associated with the BFD.  This is
-called when any BFD is closed (the @samp{bfd_write_contents} function
-mentioned earlier is only called for a BFD opened for writing).  Most
-targets use @samp{bfd_alloc} to allocate all target specific
-information, and therefore don't have to do anything in this function.
-This function pointer is typically set to
-@samp{_bfd_generic_close_and_cleanup}, which simply returns true.
+Free any target specific information associated with the BFD that
+isn't freed by @samp{_bfd_free_cached_info}.  This is called when any
+BFD is closed (the @samp{bfd_write_contents} function mentioned
+earlier is only called for a BFD opened for writing).  This function
+pointer is typically set to @samp{_bfd_generic_close_and_cleanup},
+which simply returns true.
 
 @item _bfd_free_cached_info
-Free any cached information associated with the BFD which can be
-recreated later if necessary.  This is used to reduce the memory
-consumption required by programs using BFD.  This is normally called via
-the @samp{bfd_free_cached_info} macro.  It is used by the default
-archive routines when computing the archive map.  Most targets do not
-do anything special for this entry point, and just set it to
-@samp{_bfd_generic_free_cached_info}, which simply returns true.
+This function is designed for use by the generic archive routines, and
+is also called by bfd_close.  After creating the archive map archive
+element bfds don't need symbols and other structures.  Many targets
+use @samp{bfd_alloc} to allocate target specific information and thus
+do not need to do anything special for this entry point, and just set
+it to @samp{_bfd_generic_free_cached_info} which throws away objalloc
+memory for the bfd.  Note that this means the bfd tdata and sections
+are no longer available.  Targets that malloc memory, attaching it to
+the bfd tdata or to section used_by_bfd should implement a target
+version of this function to free that memory before calling
+@samp{_bfd_generic_free_cached_info}.
 
 @item _new_section_hook
 This is called from @samp{bfd_make_section_anyway} whenever a new
index 573f52d029908d613790f2e636ff5f4237f4cc92..f2626c541e24c08b9164d7efd97e2c05bea6c603 100644 (file)
@@ -110,18 +110,20 @@ _bfd_ecoff_mkobject_hook (bfd *abfd, void * filehdr, void * aouthdr)
 }
 
 bool
-_bfd_ecoff_close_and_cleanup (bfd *abfd)
+_bfd_ecoff_bfd_free_cached_info (bfd *abfd)
 {
-  struct ecoff_tdata *tdata = ecoff_data (abfd);
+  struct ecoff_tdata *tdata;
 
-  if (tdata != NULL && bfd_get_format (abfd) == bfd_object)
+  if ((bfd_get_format (abfd) == bfd_object
+       || bfd_get_format (abfd) == bfd_core)
+      && (tdata = ecoff_data (abfd)) != NULL)
     while (tdata->mips_refhi_list != NULL)
       {
        struct mips_hi *ref = tdata->mips_refhi_list;
        tdata->mips_refhi_list = ref->next;
        free (ref);
       }
-  return _bfd_generic_close_and_cleanup (abfd);
+  return _bfd_generic_bfd_free_cached_info (abfd);
 }
 
 /* Initialize a new section.  */
index 2a64a1e6a03277e780b9a3fc63707df29b833316..e08c5a110e5f9aa2d72bc0a66215e9d2bf796529 100644 (file)
@@ -2721,7 +2721,7 @@ extern bool bfd_elf_link_record_dynamic_symbol
 extern int bfd_elf_link_record_local_dynamic_symbol
   (struct bfd_link_info *, bfd *, long);
 
-extern bool _bfd_elf_close_and_cleanup
+extern bool _bfd_elf_free_cached_info
   (bfd *);
 
 extern bool _bfd_elf_common_definition
index af2fb04dcbed96a3f03deb97b62f7a5bda305e0c..c4e2f89a16ef7e017325d7ede2283edfd2f1465c 100644 (file)
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -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
index 65e8131d5b1b5eaffe66a1971974a61a742be7e8..27bd98607fe54955a7c2b204993023b3930c70c7 100644 (file)
@@ -2599,7 +2599,7 @@ static const struct ecoff_debug_swap mips_elf32_ecoff_debug_swap = {
                                        _bfd_mips_elf_print_private_bfd_data
 #define bfd_elf32_bfd_relax_section    _bfd_mips_elf_relax_section
 #define bfd_elf32_mkobject             _bfd_mips_elf_mkobject
-#define bfd_elf32_close_and_cleanup    _bfd_mips_elf_close_and_cleanup
+#define bfd_elf32_free_cached_info     _bfd_mips_elf_free_cached_info
 
 /* Support for SGI-ish mips targets.  */
 #define TARGET_LITTLE_SYM              mips_elf32_le_vec
index 81d58c8cbc1844baaa016b5499237c526362e2a0..5cf9a665ae56c7ca46ca70a28975e32312cf9d38 100644 (file)
@@ -1519,13 +1519,6 @@ elf64_alpha_find_nearest_line (bfd *abfd, asymbol **symbols,
            (*swap->swap_fdr_in) (abfd, fraw_src, fdr_ptr);
 
          alpha_elf_tdata (abfd)->find_line_info = fi;
-
-         /* Note that we don't bother to ever free this information.
-            find_nearest_line is either called all the time, as in
-            objdump -l, so the information should be saved, or it is
-            rarely called, as in ld error messages, so the memory
-            wasted is unimportant.  Still, it would probably be a
-            good idea for free_cached_info to throw it away.  */
        }
 
       if (_bfd_ecoff_locate_line (abfd, section, offset, &fi->d, swap,
index 1866a5798fa9a0c70295c7e4827a8ba3fa0af85a..a260c7ee6d8563e4f325e3d1e3111a35a2133729 100644 (file)
@@ -4728,7 +4728,7 @@ elf64_vms_close_and_cleanup (bfd *abfd)
        }
     }
 
-  return _bfd_elf_close_and_cleanup (abfd);
+  return _bfd_generic_close_and_cleanup (abfd);
 }
 
 /* Add symbols from an ELF object file to the linker hash table.  */
index 696083e33a2cc00fca9b19b979e349850f06acb6..1179f622193b662bd2320151127e7405fa199634 100644 (file)
@@ -4815,7 +4815,7 @@ const struct elf_size_info mips_elf64_size_info =
 
 #define bfd_elf64_get_dynamic_reloc_upper_bound mips_elf64_get_dynamic_reloc_upper_bound
 #define bfd_elf64_mkobject             _bfd_mips_elf_mkobject
-#define bfd_elf64_close_and_cleanup    _bfd_mips_elf_close_and_cleanup
+#define bfd_elf64_free_cached_info     _bfd_mips_elf_free_cached_info
 
 /* The SGI style (n)64 NewABI.  */
 #define TARGET_LITTLE_SYM              mips_elf64_le_vec
index a977bec2f503807340ec4c7f3dcf1b6e9a419ad4..9c0762a15efe5e0da10ac608a521f5a4bba1630c 100644 (file)
@@ -18406,7 +18406,7 @@ ppc64_elf_free_cached_info (bfd *abfd)
       if (opd->reloc_count == 0)
        free (ppc64_elf_section_data (opd)->u.opd.u.contents);
 
-  return _bfd_free_cached_info (abfd);
+  return _bfd_generic_bfd_free_cached_info (abfd);
 }
 
 #include "elf64-target.h"
index 9e943f2d25a7e99998d8e5d5d3d9eb8712a14c10..e6aa16735862012a00d97f4c1ec36c48d12c88cc 100644 (file)
@@ -4197,7 +4197,7 @@ static const struct ecoff_debug_swap mips_elf32_ecoff_debug_swap = {
 #define bfd_elf32_bfd_print_private_bfd_data \
                                        _bfd_mips_elf_print_private_bfd_data
 #define bfd_elf32_mkobject             mips_elf_n32_mkobject
-#define bfd_elf32_close_and_cleanup    _bfd_mips_elf_close_and_cleanup
+#define bfd_elf32_free_cached_info     _bfd_mips_elf_free_cached_info
 
 /* Support for SGI-ish mips targets using n32 ABI.  */
 
index 3ad5cb95b40ec853ac411d45b1f8e18c2e9dfa31..a75cd365a02f3dad2a27a6a52f3a4113972614ae 100644 (file)
@@ -8742,7 +8742,7 @@ elfNN_aarch64_bfd_free_cached_info (bfd *abfd)
     bfd_map_over_sections (abfd,
                           unrecord_section_via_map_over_sections, NULL);
 
-  return _bfd_free_cached_info (abfd);
+  return _bfd_generic_bfd_free_cached_info (abfd);
 }
 
 /* Create dynamic sections. This is different from the ARM backend in that
index 49355a42f7d6a8330d0d8da28dd72d2606ac4cb9..7d29ec2d10581ea46002b39d89f7088c5a6718e7 100644 (file)
@@ -1419,25 +1419,25 @@ free_ecoff_debug (struct ecoff_debug_info *debug)
 }
 
 bool
-_bfd_mips_elf_close_and_cleanup (bfd *abfd)
+_bfd_mips_elf_free_cached_info (bfd *abfd)
 {
-  if (bfd_get_format (abfd) == bfd_object)
+  struct mips_elf_obj_tdata *tdata;
+
+  if ((bfd_get_format (abfd) == bfd_object
+       || bfd_get_format (abfd) == bfd_core)
+      && (tdata = mips_elf_tdata (abfd)) != NULL)
     {
-      struct mips_elf_obj_tdata *tdata = mips_elf_tdata (abfd);
-      if (tdata != NULL)
+      BFD_ASSERT (tdata->root.object_id == MIPS_ELF_DATA);
+      while (tdata->mips_hi16_list != NULL)
        {
-         BFD_ASSERT (tdata->root.object_id == MIPS_ELF_DATA);
-         while (tdata->mips_hi16_list != NULL)
-           {
-             struct mips_hi16 *hi = tdata->mips_hi16_list;
-             tdata->mips_hi16_list = hi->next;
-             free (hi);
-           }
-         if (tdata->find_line_info != NULL)
-           free_ecoff_debug (&tdata->find_line_info->d);
+         struct mips_hi16 *hi = tdata->mips_hi16_list;
+         tdata->mips_hi16_list = hi->next;
+         free (hi);
        }
+      if (tdata->find_line_info != NULL)
+       free_ecoff_debug (&tdata->find_line_info->d);
     }
-  return _bfd_elf_close_and_cleanup (abfd);
+  return _bfd_elf_free_cached_info (abfd);
 }
 
 bool
index 2c790ed5ed6703b387d4af076e85ab97b27dbf16..d78b6798754633da1a103e1abfa0513b857b22fd 100644 (file)
@@ -37,7 +37,7 @@ struct ecoff_debug_info;
 
 extern bool _bfd_mips_elf_mkobject
   (bfd *);
-extern bool _bfd_mips_elf_close_and_cleanup
+extern bool _bfd_mips_elf_free_cached_info
   (bfd *);
 extern bool _bfd_mips_elf_new_section_hook
   (bfd *, asection *);
index 9bcbdfb27dd8be5b1b68df3a3c9a5127e4038649..8eabad4bd3f2c070ab982778190aefca6a4e6760 100644 (file)
    one for little-endian machines.   */
 
 #ifndef bfd_elfNN_close_and_cleanup
-#define        bfd_elfNN_close_and_cleanup _bfd_elf_close_and_cleanup
+#define        bfd_elfNN_close_and_cleanup _bfd_generic_close_and_cleanup
 #endif
 #ifndef bfd_elfNN_bfd_free_cached_info
-#define bfd_elfNN_bfd_free_cached_info _bfd_free_cached_info
+#define bfd_elfNN_bfd_free_cached_info _bfd_elf_free_cached_info
 #endif
 #ifndef bfd_elfNN_get_section_contents
 #define bfd_elfNN_get_section_contents _bfd_generic_get_section_contents
index 07ef59a24e16d8a3195b1b7db6f771b44ba0e134..ae1b61aa4e3cb71d5d7106d7e4e76522a7ab0023 100644 (file)
@@ -261,7 +261,7 @@ extern int bfd_generic_stat_arch_elt
 extern bool _bfd_archive_close_and_cleanup
   (bfd *) ATTRIBUTE_HIDDEN;
 extern void _bfd_unlink_from_archive_parent (bfd *) ATTRIBUTE_HIDDEN;
-#define _bfd_generic_bfd_free_cached_info _bfd_bool_bfd_true
+#define _bfd_generic_bfd_free_cached_info _bfd_free_cached_info
 extern bool _bfd_generic_new_section_hook
   (bfd *, asection *) ATTRIBUTE_HIDDEN;
 extern bool _bfd_generic_get_section_contents
index 4f082ac75d62075f810a38a2fa0cc02bd9667837..92fbf0195ee16f66e54e5aba823160adda0f1b51 100644 (file)
@@ -267,7 +267,7 @@ extern int bfd_generic_stat_arch_elt
 extern bool _bfd_archive_close_and_cleanup
   (bfd *) ATTRIBUTE_HIDDEN;
 extern void _bfd_unlink_from_archive_parent (bfd *) ATTRIBUTE_HIDDEN;
-#define _bfd_generic_bfd_free_cached_info _bfd_bool_bfd_true
+#define _bfd_generic_bfd_free_cached_info _bfd_free_cached_info
 extern bool _bfd_generic_new_section_hook
   (bfd *, asection *) ATTRIBUTE_HIDDEN;
 extern bool _bfd_generic_get_section_contents
index 96f44512ac57776e1be6f0335c8f2624383729ce..4e2203656decfc59246ca77eec23376f907079bd 100644 (file)
@@ -405,7 +405,7 @@ extern bfd_vma bfd_coff_reloc16_get_value
   (arelent *, struct bfd_link_info *, asection *);
 extern void bfd_perform_slip
   (bfd *, unsigned int, asection *, bfd_vma);
-extern bool _bfd_coff_close_and_cleanup
+extern bool _bfd_coff_free_cached_info
   (bfd *);
 
 /* Functions and types in cofflink.c.  */
index 61561c5a4714ea2c94e386e726912ee761005532..b53c3117f50c4900be13d48099a8e46b8e346ba1 100644 (file)
@@ -409,7 +409,7 @@ extern bfd_vma bfd_coff_reloc16_get_value
   (arelent *, struct bfd_link_info *, asection *);
 extern void bfd_perform_slip
   (bfd *, unsigned int, asection *, bfd_vma);
-extern bool _bfd_coff_close_and_cleanup
+extern bool _bfd_coff_free_cached_info
   (bfd *);
 
 /* Functions and types in cofflink.c.  */
index 12664b890c4dccc16fe808d4cdd5fc9165e43ed4..0c4bb43c39a9db76d9721a1ec2dd90d9f45209a9 100644 (file)
@@ -243,8 +243,8 @@ extern bool _bfd_ecoff_slurp_symbolic_info
 
 extern bool _bfd_ecoff_write_object_contents (bfd *);
 
-extern bool _bfd_ecoff_close_and_cleanup (bfd *);
-#define _bfd_ecoff_bfd_free_cached_info _bfd_generic_bfd_free_cached_info
+#define _bfd_ecoff_close_and_cleanup _bfd_generic_close_and_cleanup
+extern bool _bfd_ecoff_bfd_free_cached_info (bfd *);
 extern bool _bfd_ecoff_new_section_hook
   (bfd *, asection *);
 extern bool _bfd_ecoff_get_section_contents
index f8e8dc73dc816e47d3c1246fa583e27b4fd5a483..5211486696b6de2234f20e1c67e60c2951bae7c6 100644 (file)
@@ -24,7 +24,6 @@
 #ifndef MACH_O_TARGET_COMMON_DEFINED
 #define MACH_O_TARGET_COMMON_DEFINED
 
-#define bfd_mach_o_bfd_free_cached_info                      _bfd_generic_bfd_free_cached_info
 #define bfd_mach_o_get_section_contents_in_window     _bfd_generic_get_section_contents_in_window
 #define bfd_mach_o_bfd_print_private_bfd_data        bfd_mach_o_bfd_print_private_bfd_data
 #define bfd_mach_o_bfd_is_target_special_symbol              _bfd_bool_bfd_asymbol_false
index 9b9aba5ae897e09b3ceda822112db6eb2e988866..55407fa347d955c8d4bb24d00f8beff80d1adc01 100644 (file)
@@ -6199,8 +6199,6 @@ bfd_mach_o_close_and_cleanup (bfd *abfd)
   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
   if (bfd_get_format (abfd) == bfd_object && mdata != NULL)
     {
-      _bfd_dwarf2_cleanup_debug_info (abfd, &mdata->dwarf2_find_line_info);
-      bfd_mach_o_free_cached_info (abfd);
       if (mdata->dsym_bfd != NULL)
        {
          bfd *fat_bfd = mdata->dsym_bfd->my_archive;
@@ -6231,18 +6229,27 @@ bfd_mach_o_close_and_cleanup (bfd *abfd)
 }
 
 bool
-bfd_mach_o_free_cached_info (bfd *abfd)
+bfd_mach_o_bfd_free_cached_info (bfd *abfd)
 {
-  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
-  asection *asect;
-  free (mdata->dyn_reloc_cache);
-  mdata->dyn_reloc_cache = NULL;
-  for (asect = abfd->sections; asect != NULL; asect = asect->next)
+  bfd_mach_o_data_struct *mdata;
+
+  if ((bfd_get_format (abfd) == bfd_object
+       || bfd_get_format (abfd) == bfd_core)
+      && (mdata = bfd_mach_o_get_data (abfd)) != NULL)
     {
-      free (asect->relocation);
-      asect->relocation = NULL;
+      _bfd_dwarf2_cleanup_debug_info (abfd, &mdata->dwarf2_find_line_info);
+      free (mdata->dyn_reloc_cache);
+      mdata->dyn_reloc_cache = NULL;
+
+      for (asection *asect = abfd->sections; asect; asect = asect->next)
+       {
+         free (asect->relocation);
+         asect->relocation = NULL;
+       }
     }
 
+  /* Do not call _bfd_generic_bfd_free_cached_info here.
+     bfd_mach_o_close_and_cleanup uses tdata.  */
   return true;
 }
 
index 8d99c93ea5f61da76e58559ff47eaa474085744d..1c71163bb3aa46d66640752361fcc74ec2f59e6a 100644 (file)
@@ -733,7 +733,7 @@ bool bfd_mach_o_find_nearest_line (bfd *, asymbol **,
   _bfd_nosymbols_find_nearest_line_with_alt
 #define bfd_mach_o_find_line _bfd_nosymbols_find_line
 bool bfd_mach_o_close_and_cleanup (bfd *);
-bool bfd_mach_o_free_cached_info (bfd *);
+bool bfd_mach_o_bfd_free_cached_info (bfd *);
 
 unsigned int bfd_mach_o_section_get_nbr_indirect (bfd *, bfd_mach_o_section *);
 unsigned int bfd_mach_o_section_get_entry_size (bfd *, bfd_mach_o_section *);
index 9edbba92c825dc51e89fd1371c8c5397b48b3a87..68809e5340ca29cd1089d8bf0bf78d58c5b20d3e 100644 (file)
@@ -2531,35 +2531,33 @@ NAME (aout, sizeof_headers) (bfd *abfd,
   return adata (abfd).exec_bytes_size;
 }
 
-/* Free all information we have cached for this BFD.  We can always
-   read it again later if we need it.  */
+/* Throw away most malloc'd and alloc'd information for this BFD.  */
 
 bool
 NAME (aout, bfd_free_cached_info) (bfd *abfd)
 {
-  asection *o;
-
-  if (bfd_get_format (abfd) != bfd_object
-      || abfd->tdata.aout_data == NULL)
-    return true;
-
+  if ((bfd_get_format (abfd) == bfd_object
+       || bfd_get_format (abfd) == bfd_core)
+      && abfd->tdata.aout_data != NULL)
+    {
 #define BFCI_FREE(x) do { free (x); x = NULL; } while (0)
-  BFCI_FREE (adata (abfd).line_buf);
-  BFCI_FREE (obj_aout_symbols (abfd));
+      BFCI_FREE (adata (abfd).line_buf);
+      BFCI_FREE (obj_aout_symbols (abfd));
 #ifdef USE_MMAP
-  obj_aout_external_syms (abfd) = 0;
-  bfd_free_window (&obj_aout_sym_window (abfd));
-  bfd_free_window (&obj_aout_string_window (abfd));
-  obj_aout_external_strings (abfd) = 0;
+      obj_aout_external_syms (abfd) = 0;
+      bfd_free_window (&obj_aout_sym_window (abfd));
+      bfd_free_window (&obj_aout_string_window (abfd));
+      obj_aout_external_strings (abfd) = 0;
 #else
-  BFCI_FREE (obj_aout_external_syms (abfd));
-  BFCI_FREE (obj_aout_external_strings (abfd));
+      BFCI_FREE (obj_aout_external_syms (abfd));
+      BFCI_FREE (obj_aout_external_strings (abfd));
 #endif
-  for (o = abfd->sections; o != NULL; o = o->next)
-    BFCI_FREE (o->relocation);
+      for (asection *o = abfd->sections; o != NULL; o = o->next)
+       BFCI_FREE (o->relocation);
 #undef BFCI_FREE
+    }
 
-  return true;
+  return _bfd_generic_bfd_free_cached_info (abfd);
 }
 \f
 /* Routine to create an entry in an a.out link hash table.  */
index ef1f6dc3eb616a27a4a4f564d9b80d44e7097a56..61f755e04446d348965bc356c06be51dbb9e724e 100644 (file)
--- a/bfd/som.c
+++ b/bfd/som.c
@@ -6789,13 +6789,13 @@ som_write_armap (bfd *abfd,
   return true;
 }
 
-/* Free all information we have cached for this BFD.  We can always
-   read it again later if we need it.  */
+/* Throw away some malloc'd information for this BFD.  */
 
 static bool
 som_bfd_free_cached_info (bfd *abfd)
 {
-  if (bfd_get_format (abfd) == bfd_object)
+  if (bfd_get_format (abfd) == bfd_object
+      || bfd_get_format (abfd) == bfd_core)
     {
       asection *o;
 
@@ -6813,8 +6813,8 @@ som_bfd_free_cached_info (bfd *abfd)
 #undef FREE
     }
 
-  /* Do not call _bfd_free_cached_info here.  som_write_armap needs
-     to access the bfd obj_alloc memory.  */
+  /* Do not call _bfd_generic_bfd_free_cached_info here.
+     som_write_armap needs to access the bfd objalloc memory.  */
   return true;
 }
 
index b0ad4016da333df80d893f757b7f9120dc7f9962..704dc631b7dd380f5f8811800ee061d17b03ea9b 100644 (file)
@@ -10103,25 +10103,12 @@ bfd_vms_get_data (bfd *abfd)
   return (struct vms_private_data_struct *)abfd->tdata.any;
 }
 
-#define vms_bfd_is_target_special_symbol  _bfd_bool_bfd_asymbol_false
-#define vms_bfd_link_just_syms           _bfd_generic_link_just_syms
-#define vms_bfd_copy_link_hash_symbol_type \
-  _bfd_generic_copy_link_hash_symbol_type
-#define vms_bfd_is_group_section         bfd_generic_is_group_section
-#define vms_bfd_group_name               bfd_generic_group_name
-#define vms_bfd_discard_group            bfd_generic_discard_group
-#define vms_section_already_linked       _bfd_generic_section_already_linked
-#define vms_bfd_define_common_symbol     bfd_generic_define_common_symbol
-#define vms_bfd_link_hide_symbol         _bfd_generic_link_hide_symbol
-#define vms_bfd_define_start_stop         bfd_generic_define_start_stop
-#define vms_bfd_copy_private_header_data  _bfd_generic_bfd_copy_private_header_data
-
 #define vms_bfd_copy_private_bfd_data    _bfd_generic_bfd_copy_private_bfd_data
-#define vms_bfd_free_cached_info         _bfd_generic_bfd_free_cached_info
+#define vms_bfd_merge_private_bfd_data   _bfd_generic_bfd_merge_private_bfd_data
 #define vms_bfd_copy_private_section_data _bfd_generic_bfd_copy_private_section_data
 #define vms_bfd_copy_private_symbol_data  _bfd_generic_bfd_copy_private_symbol_data
+#define vms_bfd_copy_private_header_data  _bfd_generic_bfd_copy_private_header_data
 #define vms_bfd_set_private_flags        _bfd_generic_bfd_set_private_flags
-#define vms_bfd_merge_private_bfd_data   _bfd_generic_bfd_merge_private_bfd_data
 
 /* Symbols table.  */
 #define alpha_vms_make_empty_symbol       _bfd_generic_make_empty_symbol
@@ -10144,7 +10131,7 @@ bfd_vms_get_data (bfd *abfd)
 
 /* Generic table.  */
 #define alpha_vms_close_and_cleanup       vms_close_and_cleanup
-#define alpha_vms_bfd_free_cached_info    vms_bfd_free_cached_info
+#define alpha_vms_bfd_free_cached_info    _bfd_bool_bfd_true
 #define alpha_vms_new_section_hook        vms_new_section_hook
 #define alpha_vms_set_section_contents    _bfd_vms_set_section_contents
 #define alpha_vms_get_section_contents_in_window _bfd_generic_get_section_contents_in_window