bfd_close and target free_cached_memory
authorAlan Modra <amodra@gmail.com>
Wed, 31 May 2023 11:47:48 +0000 (21:17 +0930)
committerAlan Modra <amodra@gmail.com>
Thu, 1 Jun 2023 00:21:59 +0000 (09:51 +0930)
bfd_free_cached_info is used in just one place in archive.c, which
means most times we reach bfd_close the function isn't called.  On the
other hand, if bfd_free_cached_info is called we can't do much on the
bfd since it loses all its obj_alloc memory.  This restricts what can
be done in a target _close_and_cleanup.  In particular you can't look
at sections, which leads to duplication of code in target
close_and_cleanup and free_cached_info, eg. elfnn-aarch64.c.

* opncls.c (_bfd_delete_bfd): Call bfd_free_cached_info.
* elfnn-aarch64.c (elfNN_aarch64_close_and_cleanup): Delete.
(bfd_elfNN_close_and_cleanup): Don't define.
* som.c (som_bfd_free_cached_info): Don't call
_bfd_generic_close_and_cleanup here.
(som_close_and_cleanup): Define as _bfd_generic_close_and_cleanup.

bfd/elfnn-aarch64.c
bfd/opncls.c
bfd/som.c

index 32799b6b009473ead4977d8dd52534b3539964fa..3ad5cb95b40ec853ac411d45b1f8e18c2e9dfa31 100644 (file)
@@ -8735,16 +8735,6 @@ unrecord_section_via_map_over_sections (bfd *abfd ATTRIBUTE_UNUSED,
   unrecord_section_with_aarch64_elf_section_data (sec);
 }
 
-static bool
-elfNN_aarch64_close_and_cleanup (bfd *abfd)
-{
-  if (abfd->sections)
-    bfd_map_over_sections (abfd,
-                          unrecord_section_via_map_over_sections, NULL);
-
-  return _bfd_elf_close_and_cleanup (abfd);
-}
-
 static bool
 elfNN_aarch64_bfd_free_cached_info (bfd *abfd)
 {
@@ -10263,9 +10253,6 @@ const struct elf_size_info elfNN_aarch64_size_info =
 #define ELF_MAXPAGESIZE                        0x10000
 #define ELF_COMMONPAGESIZE             0x1000
 
-#define bfd_elfNN_close_and_cleanup            \
-  elfNN_aarch64_close_and_cleanup
-
 #define bfd_elfNN_bfd_free_cached_info         \
   elfNN_aarch64_bfd_free_cached_info
 
index f0064954bf367acf3a9fcd9a6fd24e1d4de88570..b0c23b4201cdbd5713342f4d0374194eeb12666f 100644 (file)
@@ -156,6 +156,11 @@ _bfd_new_bfd_contained_in (bfd *obfd)
 static void
 _bfd_delete_bfd (bfd *abfd)
 {
+  /* Give the target _bfd_free_cached_info a chance to free memory.  */
+  if (abfd->memory)
+    bfd_free_cached_info (abfd);
+
+  /* The target _bfd_free_cached_info may not have done anything..  */
   if (abfd->memory)
     {
       bfd_hash_table_free (&abfd->section_htab);
index 0780b235e0eaa25a45ac53675e1a8c1d1d6d264d..ef1f6dc3eb616a27a4a4f564d9b80d44e7097a56 100644 (file)
--- a/bfd/som.c
+++ b/bfd/som.c
@@ -6813,7 +6813,9 @@ som_bfd_free_cached_info (bfd *abfd)
 #undef FREE
     }
 
-  return _bfd_generic_close_and_cleanup (abfd);
+  /* Do not call _bfd_free_cached_info here.  som_write_armap needs
+     to access the bfd obj_alloc memory.  */
+  return true;
 }
 
 /* End of miscellaneous support functions.  */
@@ -6828,7 +6830,7 @@ som_bfd_link_split_section (bfd *abfd ATTRIBUTE_UNUSED, asection *sec)
 
 #define som_find_line                          _bfd_nosymbols_find_line
 #define som_get_symbol_version_string          _bfd_nosymbols_get_symbol_version_string
-#define        som_close_and_cleanup                   som_bfd_free_cached_info
+#define som_close_and_cleanup                  _bfd_generic_close_and_cleanup
 #define som_read_ar_hdr                                _bfd_generic_read_ar_hdr
 #define som_write_ar_hdr                       _bfd_generic_write_ar_hdr
 #define som_openr_next_archived_file           bfd_generic_openr_next_archived_file