objdump: don't cache section contents in load_specific_debug_section
authorAlan Modra <amodra@gmail.com>
Mon, 15 Feb 2021 01:34:11 +0000 (12:04 +1030)
committerAlan Modra <amodra@gmail.com>
Mon, 15 Feb 2021 03:04:08 +0000 (13:34 +1030)
* objdump.c (load_specific_debug_section): Don't call
bfd_cache_section_contents.  Rearrange so that
bfd_get_full_section_contents is not called on path where
bfd_simple_get_relocated_section_contents is called.
Don't set section->user_data.
(free_debug_section): Always free section->start.  Don't twiddle
section flags.
* readelf.c (load_specific_debug_section): Don't set user_data.
* dwarf.h (struct dwarf_section): Remove use_data field.
* dwarf.c (NO_ABBREVS, ABBREV): Adjust to suit.

binutils/ChangeLog
binutils/dwarf.c
binutils/dwarf.h
binutils/objdump.c
binutils/readelf.c

index a7a9cae080e17a20d1b9c092d234b42be7ca45db..0edfcbe3f28e0b11b18922b08b2a1521b7d166dd 100644 (file)
@@ -1,3 +1,16 @@
+2021-02-15  Alan Modra  <amodra@gmail.com>
+
+       * objdump.c (load_specific_debug_section): Don't call
+       bfd_cache_section_contents.  Rearrange so that
+       bfd_get_full_section_contents is not called on path where
+       bfd_simple_get_relocated_section_contents is called.
+       Don't set section->user_data.
+       (free_debug_section): Always free section->start.  Don't twiddle
+       section flags.
+       * readelf.c (load_specific_debug_section): Don't set user_data.
+       * dwarf.h (struct dwarf_section): Remove use_data field.
+       * dwarf.c (NO_ABBREVS, ABBREV): Adjust to suit.
+
 2021-02-15  Alan Modra  <amodra@gmail.com>
 
        * testsuite/binutils-all/compress.exp: Remove nds32 xfails.
index ce1aeff7ee4829b44dfaf6809ba14f45d5b176d1..c863acfeda24f0a58e046327a6d9efe1ace13d76 100644 (file)
@@ -11491,8 +11491,8 @@ dwarf_select_sections_all (void)
   do_debug_str_offsets = 1;
 }
 
-#define NO_ABBREVS   NULL, NULL, NULL, 0, 0, 0, NULL, 0, NULL
-#define ABBREV(N)    NULL, NULL, NULL, 0, 0, N, NULL, 0, NULL
+#define NO_ABBREVS   NULL, NULL, NULL, 0, 0, 0, NULL, 0
+#define ABBREV(N)    NULL, NULL, NULL, 0, 0, N, NULL, 0
 
 /* N.B. The order here must match the order in section_display_enum.  */
 
index 756a5606fd2a7b3365ba0a03d2325e900dba66a6..98fbef8183dde6e25dc40db1dcaef98d5dae23f1 100644 (file)
@@ -143,8 +143,6 @@ struct dwarf_section
   /* Used by clients to help them implement the reloc_at callback.  */
   void *                           reloc_info;
   unsigned long                    num_relocs;
-  /* A spare field for random use.  */
-  void *                           user_data;
 };
 
 /* A structure containing the name of a debug section
index 304785009bfab54efd409c57cfd0e9374688465d..47b23099ec9f572024e7af8ba40fc52c48d64b70 100644 (file)
@@ -3552,6 +3552,7 @@ load_specific_debug_section (enum dwarf_section_display_enum debug,
   bfd_byte *contents;
   bfd_size_type amt;
   size_t alloced;
+  bfd_boolean ret;
 
   if (section->start != NULL)
     {
@@ -3565,7 +3566,6 @@ load_specific_debug_section (enum dwarf_section_display_enum debug,
   section->reloc_info = NULL;
   section->num_relocs = 0;
   section->address = bfd_section_vma (sec);
-  section->user_data = sec;
   section->size = bfd_section_size (sec);
   /* PR 24360: On 32-bit hosts sizeof (size_t) < sizeof (bfd_size_type). */
   alloced = amt = section->size + 1;
@@ -3578,57 +3578,50 @@ load_specific_debug_section (enum dwarf_section_display_enum debug,
              (unsigned long long) section->size);
       return FALSE;
     }
-  section->start = contents = malloc (alloced);
-  if (section->start == NULL
-      || !bfd_get_full_section_contents (abfd, sec, &contents))
-    {
-      free_debug_section (debug);
-      printf (_("\nCan't get contents for section '%s'.\n"),
-             sanitize_string (section->name));
-      return FALSE;
-    }
+
+  section->start = contents = xmalloc (alloced);
   /* Ensure any string section has a terminating NUL.  */
   section->start[section->size] = 0;
 
   if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0
       && debug_displays [debug].relocate)
     {
-      long         reloc_size;
-      bfd_boolean  ret;
-
-      bfd_cache_section_contents (sec, section->start);
-
       ret = bfd_simple_get_relocated_section_contents (abfd,
                                                       sec,
                                                       section->start,
                                                       syms) != NULL;
-
-      if (! ret)
-        {
-          free_debug_section (debug);
-          printf (_("\nCan't get contents for section '%s'.\n"),
-                 sanitize_string (section->name));
-          return FALSE;
-        }
-
-      reloc_size = bfd_get_reloc_upper_bound (abfd, sec);
-      if (reloc_size > 0)
+      if (ret)
        {
-         unsigned long reloc_count;
-         arelent **relocs;
-
-         relocs = (arelent **) xmalloc (reloc_size);
+         long reloc_size = bfd_get_reloc_upper_bound (abfd, sec);
 
-         reloc_count = bfd_canonicalize_reloc (abfd, sec, relocs, NULL);
-         if (reloc_count == 0)
-           free (relocs);
-         else
+         if (reloc_size > 0)
            {
-             section->reloc_info = relocs;
-             section->num_relocs = reloc_count;
+             unsigned long reloc_count;
+             arelent **relocs;
+
+             relocs = (arelent **) xmalloc (reloc_size);
+
+             reloc_count = bfd_canonicalize_reloc (abfd, sec, relocs, NULL);
+             if (reloc_count == 0)
+               free (relocs);
+             else
+               {
+                 section->reloc_info = relocs;
+                 section->num_relocs = reloc_count;
+               }
            }
        }
     }
+  else
+    ret = bfd_get_full_section_contents (abfd, sec, &contents);
+
+  if (!ret)
+    {
+      free_debug_section (debug);
+      printf (_("\nCan't get contents for section '%s'.\n"),
+             sanitize_string (section->name));
+      return FALSE;
+    }
 
   return TRUE;
 }
@@ -3686,26 +3679,6 @@ free_debug_section (enum dwarf_section_display_enum debug)
 {
   struct dwarf_section *section = &debug_displays [debug].section;
 
-  if (section->start == NULL)
-    return;
-
-  /* PR 17512: file: 0f67f69d.  */
-  if (section->user_data != NULL)
-    {
-      asection * sec = (asection *) section->user_data;
-
-      /* If we are freeing contents that are also pointed to by the BFD
-        library's section structure then make sure to update those pointers
-        too.  Otherwise, the next time we try to load data for this section
-        we can end up using a stale pointer.  */
-      if (section->start == sec->contents)
-       {
-         sec->contents = NULL;
-         sec->flags &= ~ SEC_IN_MEMORY;
-         sec->compress_status = COMPRESS_SECTION_NONE;
-       }
-    }
-
   free ((char *) section->start);
   section->start = NULL;
   section->address = 0;
index 77e450a619519d6a64ba158ff5abaa04289b6ca4..755634dfe5d04c5811db923bcbfc3db58139810d 100644 (file)
@@ -14898,7 +14898,6 @@ load_specific_debug_section (enum dwarf_section_display_enum  debug,
 
   snprintf (buf, sizeof (buf), _("%s section data"), section->name);
   section->address = sec->sh_addr;
-  section->user_data = NULL;
   section->filename = filedata->file_name;
   section->start = (unsigned char *) get_data (NULL, filedata,
                                                sec->sh_offset, 1,