PR 6878
[deliverable/binutils-gdb.git] / binutils / objdump.c
index c46d2690577659145f18f3252cf458a20cb33b1e..5fad8ddcce99b7b75dfcbcd05cbe2f0459b67840 100644 (file)
@@ -740,6 +740,27 @@ find_symbol_for_address (bfd_vma vma,
             == bfd_asymbol_value (sorted_syms[thisplace - 1])))
     --thisplace;
 
+  /* Prefer a symbol in the current section if we have multple symbols
+     with the same value, as can occur with overlays or zero size
+     sections.  */
+  min = thisplace;
+  while (min < max
+        && (bfd_asymbol_value (sorted_syms[min])
+            == bfd_asymbol_value (sorted_syms[thisplace])))
+    {
+      if (sorted_syms[min]->section == sec
+         && info->symbol_is_valid (sorted_syms[min], info))
+       {
+         thisplace = min;
+
+         if (place != NULL)
+           *place = thisplace;
+
+         return sorted_syms[thisplace];
+       }
+      ++min;
+    }
+
   /* If the file is relocatable, and the symbol could be from this
      section, prefer a symbol from this section over symbols from
      others, even if the other symbol's value might be closer.
@@ -759,19 +780,9 @@ find_symbol_for_address (bfd_vma vma,
       || !info->symbol_is_valid (sorted_syms[thisplace], info))
     {
       long i;
-      long newplace;
+      long newplace = sorted_symcount;
 
-      for (i = thisplace + 1; i < sorted_symcount; i++)
-       {
-         if (bfd_asymbol_value (sorted_syms[i])
-             != bfd_asymbol_value (sorted_syms[thisplace]))
-           break;
-       }
-
-      --i;
-      newplace = sorted_symcount;
-
-      for (; i >= 0; i--)
+      for (i = min - 1; i >= 0; i--)
        {
          if ((sorted_syms[i]->section == sec || !want_section)
              && info->symbol_is_valid (sorted_syms[i], info))
@@ -877,7 +888,7 @@ objdump_print_addr (bfd_vma vma,
                    bfd_boolean skip_zeroes)
 {
   struct objdump_disasm_info *aux;
-  asymbol *sym;
+  asymbol *sym = NULL;
   bfd_boolean skip_find = FALSE;
 
   aux = (struct objdump_disasm_info *) info->application_data;
@@ -964,7 +975,7 @@ static struct print_file_list *print_files;
 
 #define SHOW_PRECEDING_CONTEXT_LINES (5)
 
-/* Read a complete file into memory. */
+/* Read a complete file into memory.  */
 
 static const char *
 slurp_file (const char *fn, size_t *size)
@@ -975,7 +986,7 @@ slurp_file (const char *fn, size_t *size)
 #endif
   const char *map;
   struct stat st;
-  int fd = open (fn, O_RDONLY);
+  int fd = open (fn, O_RDONLY | O_BINARY);
 
   if (fd < 0)
     return NULL;
@@ -1417,7 +1428,8 @@ disassemble_bytes (struct disassemble_info * info,
          if (display_file_offsets && ((addr_offset + (octets / opb)) < stop_offset))
            printf ("\t... (skipping %d zeroes, resuming at file offset: 0x%lx)\n",
                    octets / opb,
-                   (long int)(section->filepos + (addr_offset + (octets / opb))));
+                   (unsigned long) (section->filepos
+                                    + (addr_offset + (octets / opb))));
          else
            printf ("\t...\n");
        }
@@ -2051,15 +2063,25 @@ load_debug_section (enum dwarf_section_display_enum debug, void *file)
   bfd *abfd = file;
   asection *sec;
   bfd_boolean ret;
+  int section_is_compressed;
 
   /* If it is already loaded, do nothing.  */
   if (section->start != NULL)
     return 1;
 
   /* Locate the debug section.  */
-  sec = bfd_get_section_by_name (abfd, section->name);
+  sec = bfd_get_section_by_name (abfd, section->uncompressed_name);
+  if (sec != NULL)
+    section->name = section->uncompressed_name;
+  else
+    {
+      sec = bfd_get_section_by_name (abfd, section->compressed_name);
+      if (sec != NULL)
+       section->name = section->compressed_name;
+    }
   if (sec == NULL)
     return 0;
+  section_is_compressed = section->name == section->compressed_name;
 
   /* Compute a bias to be added to offsets found within the DWARF debug
      information.  These offsets are meant to be relative to the start of
@@ -2086,11 +2108,24 @@ load_debug_section (enum dwarf_section_display_enum debug, void *file)
     ret = bfd_get_section_contents (abfd, sec, section->start, 0,
                                    section->size);
 
-  if (!ret)
+  if (! ret)
     {
       free_debug_section (debug);
       printf (_("\nCan't get contents for section '%s'.\n"),
              section->name);
+      return 0;
+    }
+
+  if (section_is_compressed)
+    {
+      bfd_size_type size = section->size;
+      if (! bfd_uncompress_section_contents (&section->start, &size))
+        {
+          free_debug_section (debug);
+          printf (_("\nCan't uncompress section '%s'.\n"), section->name);
+          return 0;
+        }
+      section->size = size;
     }
 
   return ret;
@@ -2124,15 +2159,16 @@ dump_dwarf_section (bfd *abfd, asection *section,
     match = name;
 
   for (i = 0; i < max; i++)
-    if (strcmp (debug_displays[i].section.name, match) == 0)
+    if (strcmp (debug_displays [i].section.uncompressed_name, match) == 0
+        || strcmp (debug_displays [i].section.compressed_name, match) == 0)
       {
-       if (!debug_displays[i].eh_frame)
+       if (!debug_displays [i].eh_frame)
          {
            struct dwarf_section *sec = &debug_displays [i].section;
 
            if (load_debug_section (i, abfd))
              {
-               debug_displays[i].display (sec, abfd);
+               debug_displays [i].display (sec, abfd);
 
                if (i != info && i != abbrev)
                  free_debug_section (i);
@@ -2142,7 +2178,7 @@ dump_dwarf_section (bfd *abfd, asection *section,
       }
 }
 
-static const char *mach_o_dwarf_sections [] = {
+static const char *mach_o_uncompressed_dwarf_sections [] = {
   "LC_SEGMENT.__DWARFA.__debug_abbrev",                /* .debug_abbrev */
   "LC_SEGMENT.__DWARFA.__debug_aranges",       /* .debug_aranges */
   "LC_SEGMENT.__DWARFA.__debug_frame",         /* .debug_frame */
@@ -2161,7 +2197,27 @@ static const char *mach_o_dwarf_sections [] = {
   "LC_SEGMENT.__DWARFA.__debug_weaknames"      /* .debug_weaknames */
 };
 
-static const char *generic_dwarf_sections [max];
+static const char *mach_o_compressed_dwarf_sections [] = {
+  "LC_SEGMENT.__DWARFA.__zdebug_abbrev",       /* .zdebug_abbrev */
+  "LC_SEGMENT.__DWARFA.__zdebug_aranges",      /* .zdebug_aranges */
+  "LC_SEGMENT.__DWARFA.__zdebug_frame",                /* .zdebug_frame */
+  "LC_SEGMENT.__DWARFA.__zdebug_info",         /* .zdebug_info */
+  "LC_SEGMENT.__DWARFA.__zdebug_line",         /* .zdebug_line */
+  "LC_SEGMENT.__DWARFA.__zdebug_pubnames",     /* .zdebug_pubnames */
+  ".eh_frame",                                 /* .eh_frame */
+  "LC_SEGMENT.__DWARFA.__zdebug_macinfo",      /* .zdebug_macinfo */
+  "LC_SEGMENT.__DWARFA.__zdebug_str",          /* .zdebug_str */
+  "LC_SEGMENT.__DWARFA.__zdebug_loc",          /* .zdebug_loc */
+  "LC_SEGMENT.__DWARFA.__zdebug_pubtypes",     /* .zdebug_pubtypes */
+  "LC_SEGMENT.__DWARFA.__zdebug_ranges",       /* .zdebug_ranges */
+  "LC_SEGMENT.__DWARFA.__zdebug_static_func",  /* .zdebug_static_func */
+  "LC_SEGMENT.__DWARFA.__zdebug_static_vars",  /* .zdebug_static_vars */
+  "LC_SEGMENT.__DWARFA.__zdebug_types",                /* .zdebug_types */
+  "LC_SEGMENT.__DWARFA.__zdebug_weaknames"     /* .zdebug_weaknames */
+};
+
+static const char *generic_uncompressed_dwarf_sections [max];
+static const char *generic_compressed_dwarf_sections [max];
 
 static void
 check_mach_o_dwarf (bfd *abfd)
@@ -2170,18 +2226,33 @@ check_mach_o_dwarf (bfd *abfd)
   enum bfd_flavour current_flavour = bfd_get_flavour (abfd);
   enum dwarf_section_display_enum i;
 
-  if (generic_dwarf_sections [0] == NULL)
+  if (generic_uncompressed_dwarf_sections [0] == NULL)
     for (i = 0; i < max; i++)
-      generic_dwarf_sections [i] = debug_displays[i].section.name;
+      {
+        generic_uncompressed_dwarf_sections [i]
+            = debug_displays[i].section.uncompressed_name;
+        generic_compressed_dwarf_sections [i]
+            = debug_displays[i].section.compressed_name;
+      }
 
   if (old_flavour != current_flavour)
     {
       if (current_flavour == bfd_target_mach_o_flavour)
        for (i = 0; i < max; i++)
-         debug_displays[i].section.name = mach_o_dwarf_sections [i];
+          {
+            debug_displays[i].section.uncompressed_name
+                = mach_o_uncompressed_dwarf_sections [i];
+            debug_displays[i].section.compressed_name
+                = mach_o_compressed_dwarf_sections [i];
+          }
       else if (old_flavour == bfd_target_mach_o_flavour)
        for (i = 0; i < max; i++)
-         debug_displays[i].section.name = generic_dwarf_sections [i];
+          {
+            debug_displays[i].section.uncompressed_name
+                = generic_uncompressed_dwarf_sections [i];
+            debug_displays[i].section.compressed_name
+                = generic_compressed_dwarf_sections [i];
+          }
 
       old_flavour = current_flavour;
     }
@@ -2403,6 +2474,10 @@ dump_stabs (bfd *abfd)
   dump_stabs_section (abfd, ".stab", ".stabstr");
   dump_stabs_section (abfd, ".stab.excl", ".stab.exclstr");
   dump_stabs_section (abfd, ".stab.index", ".stab.indexstr");
+
+  /* For Darwin.  */
+  dump_stabs_section (abfd, "LC_SYMTAB.stabs", "LC_SYMTAB.stabstr");
+
   dump_stabs_section (abfd, "$GDB_SYMBOLS$", "$GDB_STRINGS$");
 }
 \f
@@ -2493,7 +2568,8 @@ dump_section (bfd *abfd, asection *section, void *dummy ATTRIBUTE_UNUSED)
   
   printf (_("Contents of section %s:"), section->name);
   if (display_file_offsets)
-    printf (_("  (Starting at file offset: 0x%lx)"), (long int)(section->filepos + start_offset));
+    printf (_("  (Starting at file offset: 0x%lx)"),
+           (unsigned long) (section->filepos + start_offset));
   printf ("\n");
 
   data = xmalloc (datasize);
@@ -2937,7 +3013,7 @@ dump_bfd (bfd *abfd)
     {
       void *dhandle;
 
-      dhandle = read_debugging_info (abfd, syms, symcount);
+      dhandle = read_debugging_info (abfd, syms, symcount, TRUE);
       if (dhandle != NULL)
        {
          if (!print_debugging_info (stdout, dhandle, abfd, syms,
@@ -2949,6 +3025,12 @@ dump_bfd (bfd *abfd)
              exit_status = 1;
            }
        }
+      /* PR 6483: If there was no STABS or IEEE debug
+        info in the file, try DWARF instead.  */
+      else if (! dump_dwarf_section_info)
+       {
+         dump_dwarf (abfd);
+       }
     }
 
   if (syms)
This page took 0.0266189999999999 seconds and 4 git commands to generate.