bfd/Changelog:
[deliverable/binutils-gdb.git] / binutils / objdump.c
index 358d3196122757e27cb2f7b7e16422cf8ee10b44..9e54192003eccc8d31a573f382efcb206eba0791 100644 (file)
@@ -1873,63 +1873,39 @@ disassemble_data (bfd *abfd)
   free (sorted_syms);
 }
 \f
-/* Read ABFD's stabs section STABSECT_NAME into `stabs'
-   and string table section STRSECT_NAME into `strtab'.
-   If the section exists and was read, allocate the space and return TRUE.
-   Otherwise return FALSE.  */
+/* Read ABFD's stabs section STABSECT_NAME, and return a pointer to
+   it.  Return NULL on failure.   */
 
-static bfd_boolean
-read_section_stabs (bfd *abfd, const char *stabsect_name,
-                   const char *strsect_name)
+static char *
+read_section_stabs (bfd *abfd, const char *sect_name, bfd_size_type *size_ptr)
 {
-  asection *stabsect, *stabstrsect;
+  asection *stabsect;
+  bfd_size_type size;
+  char *contents;
 
-  stabsect = bfd_get_section_by_name (abfd, stabsect_name);
+  stabsect = bfd_get_section_by_name (abfd, sect_name);
   if (stabsect == NULL)
     {
-      printf (_("No %s section present\n\n"), stabsect_name);
+      printf (_("No %s section present\n\n"), sect_name);
       return FALSE;
     }
 
-  stabstrsect = bfd_get_section_by_name (abfd, strsect_name);
-  if (stabstrsect == NULL)
-    {
-      non_fatal (_("%s has no %s section"),
-                bfd_get_filename (abfd), strsect_name);
-      exit_status = 1;
-      return FALSE;
-    }
+  size = bfd_section_size (abfd, stabsect);
+  contents  = xmalloc (size);
 
-  stab_size    = bfd_section_size (abfd, stabsect);
-  stabstr_size = bfd_section_size (abfd, stabstrsect);
-
-  stabs  = xmalloc (stab_size);
-  strtab = xmalloc (stabstr_size);
-
-  if (! bfd_get_section_contents (abfd, stabsect, stabs, 0, stab_size))
+  if (! bfd_get_section_contents (abfd, stabsect, contents, 0, size))
     {
       non_fatal (_("Reading %s section of %s failed: %s"),
-                stabsect_name, bfd_get_filename (abfd),
+                sect_name, bfd_get_filename (abfd),
                 bfd_errmsg (bfd_get_error ()));
-      free (stabs);
-      free (strtab);
+      free (contents);
       exit_status = 1;
-      return FALSE;
+      return NULL;
     }
 
-  if (! bfd_get_section_contents (abfd, stabstrsect, (void *) strtab, 0,
-                                 stabstr_size))
-    {
-      non_fatal (_("Reading %s section of %s failed: %s\n"),
-                strsect_name, bfd_get_filename (abfd),
-                bfd_errmsg (bfd_get_error ()));
-      free (stabs);
-      free (strtab);
-      exit_status = 1;
-      return FALSE;
-    }
+  *size_ptr = size;
 
-  return TRUE;
+  return contents;
 }
 
 /* Stabs entries use a 12 byte format:
@@ -1951,11 +1927,11 @@ read_section_stabs (bfd *abfd, const char *stabsect_name,
    using string table section STRSECT_NAME (in `strtab').  */
 
 static void
-print_section_stabs (bfd *abfd, const char *stabsect_name)
+print_section_stabs (bfd *abfd, const char *stabsect_name, unsigned *string_offset_ptr)
 {
   int i;
   unsigned file_string_table_offset = 0;
-  unsigned next_file_string_table_offset = 0;
+  unsigned next_file_string_table_offset = *string_offset_ptr;
   bfd_byte *stabp, *stabs_end;
 
   stabp = stabs;
@@ -2015,12 +1991,14 @@ print_section_stabs (bfd *abfd, const char *stabsect_name)
        }
     }
   printf ("\n\n");
+  *string_offset_ptr = next_file_string_table_offset;
 }
 
 typedef struct
 {
   const char * section_name;
   const char * string_section_name;
+  unsigned string_offset;
 }
 stab_section_names;
 
@@ -2031,7 +2009,7 @@ find_stabs_section (bfd *abfd, asection *section, void *names)
   stab_section_names * sought = (stab_section_names *) names;
 
   /* Check for section names for which stabsect_name is a prefix, to
-     handle .stab0, etc.  */
+     handle .stab.N, etc.  */
   len = strlen (sought->section_name);
 
   /* If the prefix matches, and the files section name ends with a
@@ -2039,13 +2017,17 @@ find_stabs_section (bfd *abfd, asection *section, void *names)
      match or a section followed by a number.  */
   if (strncmp (sought->section_name, section->name, len) == 0
       && (section->name[len] == 0
-         || ISDIGIT (section->name[len])))
+         || (section->name[len] == '.' && ISDIGIT (section->name[len + 1]))))
     {
-      if (read_section_stabs (abfd, section->name, sought->string_section_name))
+      if (strtab == NULL)
+       strtab = read_section_stabs (abfd, sought->string_section_name,
+                                    &stabstr_size);
+      
+      if (strtab)
        {
-         print_section_stabs (abfd, section->name);
-         free (stabs);
-         free (strtab);
+         stabs = read_section_stabs (abfd, section->name, &stab_size);
+         if (stabs)
+           print_section_stabs (abfd, section->name, &sought->string_offset);
        }
     }
 }
@@ -2057,8 +2039,12 @@ dump_stabs_section (bfd *abfd, char *stabsect_name, char *strsect_name)
 
   s.section_name = stabsect_name;
   s.string_section_name = strsect_name;
-  
+  s.string_offset = 0;
+
   bfd_map_over_sections (abfd, find_stabs_section, & s);
+
+  free (strtab);
+  strtab = NULL;
 }
 
 /* Dump the any sections containing stabs debugging information.  */
This page took 0.039524 seconds and 4 git commands to generate.