2006-04-25 H.J. Lu <hongjiu.lu@intel.com>
authorH.J. Lu <hjl.tools@gmail.com>
Tue, 25 Apr 2006 17:46:15 +0000 (17:46 +0000)
committerH.J. Lu <hjl.tools@gmail.com>
Tue, 25 Apr 2006 17:46:15 +0000 (17:46 +0000)
PR binutils/2467
* elf.c (_bfd_elf_close_and_cleanup): Check elf_tdata (abfd)
is NULL first.

* elf32-arm.c (elf32_arm_close_and_cleanup): Check if
abfd->sections is NULL.
(elf32_arm_bfd_free_cached_info): New.
(bfd_elf32_bfd_free_cached_info): Defined.

* elfxx-target.h (bfd_elfNN_bfd_free_cached_info): Default it
to _bfd_free_cached_info.

* libbfd-in.h (_bfd_free_cached_info): New.
* libbfd: Regenerated.

* opncls.c (_bfd_delete_bfd): Check if abfd->memory is NULL.
(_bfd_free_cached_info): New.

bfd/ChangeLog
bfd/elf.c
bfd/elf32-arm.c
bfd/elfxx-target.h
bfd/libbfd-in.h
bfd/opncls.c

index c5baeb62d2faf87d2814a87f0a47fc312cc57c1a..c134282f10704300f0be43684a5cd6bba416fb54 100644 (file)
@@ -1,3 +1,23 @@
+2006-04-25  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR binutils/2467
+       * elf.c (_bfd_elf_close_and_cleanup): Check elf_tdata (abfd)
+       is NULL first.
+
+       * elf32-arm.c (elf32_arm_close_and_cleanup): Check if
+       abfd->sections is NULL.
+       (elf32_arm_bfd_free_cached_info): New.
+       (bfd_elf32_bfd_free_cached_info): Defined.
+
+       * elfxx-target.h (bfd_elfNN_bfd_free_cached_info): Default it
+       to _bfd_free_cached_info.
+
+       * libbfd-in.h (_bfd_free_cached_info): New.
+       * libbfd: Regenerated.
+
+       * opncls.c (_bfd_delete_bfd): Check if abfd->memory is NULL.
+       (_bfd_free_cached_info): New.
+
 2006-04-21  Alan Modra  <amodra@bigpond.net.au>
 
        * elf.c (assign_file_positions_except_relocs): Move code setting
index 30e1efe6bb6adf19d7dbc382f655351d28b66869..04eff22e15a190f4f4c2eac3b30fb71d889b235c 100644 (file)
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -7207,7 +7207,7 @@ _bfd_elf_close_and_cleanup (bfd *abfd)
 {
   if (bfd_get_format (abfd) == bfd_object)
     {
-      if (elf_shstrtab (abfd) != NULL)
+      if (elf_tdata (abfd) != NULL && elf_shstrtab (abfd) != NULL)
        _bfd_elf_strtab_free (elf_shstrtab (abfd));
       _bfd_dwarf2_cleanup_debug_info (abfd);
     }
index ca33121708da810026e27cbdb60b41a975c2023f..bd3c4e3356b1e0c386e48ae99bc1475689548a40 100644 (file)
@@ -7936,11 +7936,25 @@ unrecord_section_via_map_over_sections (bfd * abfd ATTRIBUTE_UNUSED,
 static bfd_boolean
 elf32_arm_close_and_cleanup (bfd * abfd)
 {
-  bfd_map_over_sections (abfd, unrecord_section_via_map_over_sections, NULL);
+  if (abfd->sections)
+    bfd_map_over_sections (abfd,
+                          unrecord_section_via_map_over_sections,
+                          NULL);
 
   return _bfd_elf_close_and_cleanup (abfd);
 }
 
+static bfd_boolean
+elf32_arm_bfd_free_cached_info (bfd * abfd)
+{
+  if (abfd->sections)
+    bfd_map_over_sections (abfd,
+                          unrecord_section_via_map_over_sections,
+                          NULL);
+
+  return _bfd_free_cached_info (abfd);
+}
+
 /* Display STT_ARM_TFUNC symbols as functions.  */
 
 static void
@@ -8100,6 +8114,7 @@ const struct elf_size_info elf32_arm_size_info = {
 #define bfd_elf32_new_section_hook             elf32_arm_new_section_hook
 #define bfd_elf32_bfd_is_target_special_symbol elf32_arm_is_target_special_symbol
 #define bfd_elf32_close_and_cleanup             elf32_arm_close_and_cleanup
+#define bfd_elf32_bfd_free_cached_info          elf32_arm_bfd_free_cached_info
 #define bfd_elf32_bfd_final_link               elf32_arm_bfd_final_link
 
 #define elf_backend_get_symbol_type             elf32_arm_get_symbol_type
index 503726d2b8664fc61a348f452cf7e6c604cb2c88..14a693a420b6f5676317e4b675fd5893ae725ce0 100644 (file)
@@ -29,7 +29,9 @@
 #ifndef bfd_elfNN_close_and_cleanup
 #define        bfd_elfNN_close_and_cleanup _bfd_elf_close_and_cleanup
 #endif
-#define bfd_elfNN_bfd_free_cached_info _bfd_generic_bfd_free_cached_info
+#ifndef bfd_elfNN_bfd_free_cached_info
+#define bfd_elfNN_bfd_free_cached_info _bfd_free_cached_info
+#endif
 #ifndef bfd_elfNN_get_section_contents
 #define bfd_elfNN_get_section_contents _bfd_generic_get_section_contents
 #endif
index ee2484f25c12dc581a97e93cde1ffd726e690aad..2248479c5e32c4261fa1447fe6c566395f303eb5 100644 (file)
@@ -155,6 +155,8 @@ bfd * _bfd_new_bfd
   (void);
 void _bfd_delete_bfd
   (bfd *);
+bfd_boolean _bfd_free_cached_info
+  (bfd *);
 
 bfd_boolean bfd_false
   (bfd *ignore);
index b02b137889a1226df67357512cc056de39d451d0..7e62d06a5bb30a7f51c0536f8f3987c27b8b32fa 100644 (file)
@@ -115,11 +115,35 @@ _bfd_new_bfd_contained_in (bfd *obfd)
 void
 _bfd_delete_bfd (bfd *abfd)
 {
-  bfd_hash_table_free (&abfd->section_htab);
-  objalloc_free ((struct objalloc *) abfd->memory);
+  if (abfd->memory)
+    {
+      bfd_hash_table_free (&abfd->section_htab);
+      objalloc_free ((struct objalloc *) abfd->memory);
+    }
   free (abfd);
 }
 
+/* Free objalloc memory.  */
+
+bfd_boolean
+_bfd_free_cached_info (bfd *abfd)
+{
+  if (abfd->memory)
+    {
+      bfd_hash_table_free (&abfd->section_htab);
+      objalloc_free ((struct objalloc *) abfd->memory);
+
+      abfd->sections = NULL;
+      abfd->section_last = NULL;
+      abfd->outsymbols = NULL;
+      abfd->tdata.any = NULL;
+      abfd->usrdata = NULL;
+      abfd->memory = NULL;
+    }
+
+  return TRUE;
+}
+
 /*
 SECTION
        Opening and closing BFDs