2005-09-30 H.J. Lu <hongjiu.lu@intel.com>
authorH.J. Lu <hjl.tools@gmail.com>
Fri, 30 Sep 2005 14:56:34 +0000 (14:56 +0000)
committerH.J. Lu <hjl.tools@gmail.com>
Fri, 30 Sep 2005 14:56:34 +0000 (14:56 +0000)
* Makefile.am (objdump_SOURCES): Add dwarf.c.
* Makefile.in: Regenerated.

* objdump.c: Include "dwarf.h".
(usage): Add -W/--dwarf.
(long_options): Likewise.
(dump_dwarf_section_info): New.
(load_debug_section): Likewise.
(free_debug_section): Likewise.
(dump_dwarf_section): Likewise.
(dump_dwarf): Likewise.
(dump_bfd): Load symbol table and call dump_dwarf if
dump_dwarf_section_info isn't zero.
(main): Handle -W/--dwarf.

binutils/ChangeLog
binutils/Makefile.am
binutils/Makefile.in
binutils/objdump.c

index c992f651d3d71e4732abe932e6b0d7f730b6573b..a5cba760f39dc1856a95e8b16de8765c4182d395 100644 (file)
@@ -1,3 +1,20 @@
+2005-09-30  H.J. Lu  <hongjiu.lu@intel.com>
+
+       * Makefile.am (objdump_SOURCES): Add dwarf.c.
+       * Makefile.in: Regenerated.
+
+       * objdump.c: Include "dwarf.h".
+       (usage): Add -W/--dwarf.
+       (long_options): Likewise.
+       (dump_dwarf_section_info): New.
+       (load_debug_section): Likewise.
+       (free_debug_section): Likewise.
+       (dump_dwarf_section): Likewise.
+       (dump_dwarf): Likewise.
+       (dump_bfd): Load symbol table and call dump_dwarf if
+       dump_dwarf_section_info isn't zero.
+       (main): Handle -W/--dwarf.
+
 2005-09-30  H.J. Lu  <hongjiu.lu@intel.com>
 
        * readelf.c: Reordered.
index 13457f6fb3241ce8f99d2956474d8db172bd4f93..dba2f9f98fd22422e61ec90ee7f7dec6deabaaba 100644 (file)
@@ -168,7 +168,7 @@ strip_new_SOURCES = objcopy.c is-strip.c rename.c $(WRITE_DEBUG_SRCS) $(BULIBS)
 
 nm_new_SOURCES = nm.c budemang.c $(BULIBS)
 
-objdump_SOURCES = objdump.c budemang.c prdbg.c $(DEBUG_SRCS) $(BULIBS)
+objdump_SOURCES = objdump.c dwarf.c budemang.c prdbg.c $(DEBUG_SRCS) $(BULIBS)
 objdump_LDADD = $(OPCODES) $(BFDLIB) $(LIBIBERTY) $(INTLLIBS)
 
 objdump.o:objdump.c
index bc67ad7d697a86ed87fcb27d37a4f6aade47f1e4..e4fbaef0c29cf7e2556e711ee0b365929db9090a 100644 (file)
@@ -143,8 +143,9 @@ objcopy_OBJECTS = $(am_objcopy_OBJECTS)
 objcopy_LDADD = $(LDADD)
 objcopy_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2) \
        $(am__DEPENDENCIES_3)
-am_objdump_OBJECTS = objdump.$(OBJEXT) budemang.$(OBJEXT) \
-       prdbg.$(OBJEXT) $(am__objects_2) $(am__objects_1)
+am_objdump_OBJECTS = objdump.$(OBJEXT) dwarf.$(OBJEXT) \
+       budemang.$(OBJEXT) prdbg.$(OBJEXT) $(am__objects_2) \
+       $(am__objects_1)
 objdump_OBJECTS = $(am_objdump_OBJECTS)
 am__DEPENDENCIES_4 = ../opcodes/libopcodes.la
 objdump_DEPENDENCIES = $(am__DEPENDENCIES_4) $(am__DEPENDENCIES_1) \
@@ -462,7 +463,7 @@ readelf_SOURCES = readelf.c version.c unwind-ia64.c dwarf.c
 readelf_LDADD = $(INTLLIBS) $(LIBIBERTY)
 strip_new_SOURCES = objcopy.c is-strip.c rename.c $(WRITE_DEBUG_SRCS) $(BULIBS)
 nm_new_SOURCES = nm.c budemang.c $(BULIBS)
-objdump_SOURCES = objdump.c budemang.c prdbg.c $(DEBUG_SRCS) $(BULIBS)
+objdump_SOURCES = objdump.c dwarf.c budemang.c prdbg.c $(DEBUG_SRCS) $(BULIBS)
 objdump_LDADD = $(OPCODES) $(BFDLIB) $(LIBIBERTY) $(INTLLIBS)
 cxxfilt_SOURCES = cxxfilt.c $(BULIBS)
 ar_SOURCES = arparse.y arlex.l ar.c not-ranlib.c arsup.c rename.c binemul.c \
index 14c9cb6888a490873229ec422a19ab01c10bc64b..e49f0aecfcfe8fb48c72814d904aa42fd0419bad 100644 (file)
@@ -52,6 +52,7 @@
 #include "bfdver.h"
 #include "progress.h"
 #include "bucomm.h"
+#include "dwarf.h"
 #include "budemang.h"
 #include "getopt.h"
 #include "safe-ctype.h"
@@ -91,6 +92,7 @@ static int prefix_addresses;          /* --prefix-addresses */
 static int with_line_numbers;          /* -l */
 static bfd_boolean with_source_code;   /* -S */
 static int show_raw_insn;              /* --show-raw-insn */
+static int dump_dwarf_section_info;    /* --dwarf */
 static int dump_stab_section_info;     /* --stabs */
 static int do_demangle;                        /* -C, --demangle */
 static bfd_boolean disassemble;                /* -d */
@@ -189,6 +191,7 @@ usage (FILE *stream, int status)
   -g, --debugging          Display debug information in object file\n\
   -e, --debugging-tags     Display debug information using ctags style\n\
   -G, --stabs              Display (in raw form) any STABS info in the file\n\
+  -W, --dwarf              Display DWARF info in the file\n\
   -t, --syms               Display the contents of the symbol table(s)\n\
   -T, --dynamic-syms       Display the contents of the dynamic symbol table\n\
   -r, --reloc              Display the relocation entries in the file\n\
@@ -275,6 +278,7 @@ static struct option long_options[]=
   {"source", no_argument, NULL, 'S'},
   {"special-syms", no_argument, &dump_special_syms, 1},
   {"include", required_argument, NULL, 'I'},
+  {"dwarf", no_argument, NULL, 'W'},
   {"stabs", no_argument, NULL, 'G'},
   {"start-address", required_argument, NULL, OPTION_START_ADDRESS},
   {"stop-address", required_argument, NULL, OPTION_STOP_ADDRESS},
@@ -1965,6 +1969,116 @@ disassemble_data (bfd *abfd)
   free (sorted_syms);
 }
 \f
+int
+load_debug_section (enum dwarf_section_display_enum debug, void *file)
+{
+  struct dwarf_section *section = &debug_displays [debug].section;
+  bfd *abfd = file;
+  asection *sec;
+  bfd_boolean ret;
+
+  /* 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);
+  if (sec == NULL)
+    return 0;
+
+  section->address = bfd_get_section_vma (abfd, sec);
+  section->size = bfd_get_section_size (sec);
+  section->start = xmalloc (section->size);
+
+  if (is_relocatable && debug_displays [debug].relocate)
+    ret = bfd_simple_get_relocated_section_contents (abfd,
+                                                    sec,
+                                                    section->start,
+                                                    syms) != NULL;
+  else
+    ret = bfd_get_section_contents (abfd, sec, section->start, 0,
+                                   section->size);
+
+  if (!ret)
+    {
+      free_debug_section (debug);
+      printf (_("\nCan't get contents for section '%s'.\n"),
+             section->name);
+    }
+
+  return ret;
+}
+
+void
+free_debug_section (enum dwarf_section_display_enum debug)
+{
+  struct dwarf_section *section = &debug_displays [debug].section;
+
+  if (section->start == NULL)
+    return;
+
+  free ((char *) section->start);
+  section->start = NULL;
+  section->address = 0;
+  section->size = 0;
+}
+
+static void
+dump_dwarf_section (bfd *abfd, asection *section,
+                   void *arg ATTRIBUTE_UNUSED)
+{
+  const char *name = bfd_get_section_name (abfd, section);
+  const char *match;
+  enum dwarf_section_display_enum i;
+
+  if (strncmp (name, ".gnu.linkonce.wi.", 17) == 0)
+    match = ".debug_info";
+  else
+    match = name;
+
+  for (i = 0; i < max; i++)
+    if (strcmp (debug_displays[i].section.name, match) == 0)
+      {
+       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);
+
+               if (i != info && i != abbrev)
+                 free_debug_section (i);
+             }
+         }
+       break;
+      }
+}
+
+/* Dump the dwarf debugging information.  */
+
+static void
+dump_dwarf (bfd *abfd)
+{
+  is_relocatable = ((abfd->flags & (HAS_RELOC | EXEC_P | DYNAMIC))
+                   == HAS_RELOC);
+
+  /* FIXME: bfd_get_arch_size may return -1.  We assume that 64bit
+     targets will return 64.  */
+  eh_addr_size = bfd_get_arch_size (abfd) == 64 ? 8 : 4;
+
+  if (bfd_big_endian (abfd))
+    byte_get = byte_get_big_endian;
+  else if (bfd_little_endian (abfd))
+    byte_get = byte_get_little_endian;
+  else
+    abort ();
+
+  bfd_map_over_sections (abfd, dump_dwarf_section, NULL);
+
+  free_debug_memory ();
+}
+\f
 /* Read ABFD's stabs section STABSECT_NAME, and return a pointer to
    it.  Return NULL on failure.   */
 
@@ -2636,7 +2750,11 @@ dump_bfd (bfd *abfd)
   if (dump_section_headers)
     dump_headers (abfd);
 
-  if (dump_symtab || dump_reloc_info || disassemble || dump_debugging)
+  if (dump_symtab
+      || dump_reloc_info
+      || disassemble
+      || dump_debugging
+      || dump_dwarf_section_info)
     syms = slurp_symtab (abfd);
   if (dump_dynamic_symtab || dump_dynamic_reloc_info
       || (disassemble && bfd_get_dynamic_symtab_upper_bound (abfd) > 0))
@@ -2653,6 +2771,8 @@ dump_bfd (bfd *abfd)
     dump_symbols (abfd, FALSE);
   if (dump_dynamic_symtab)
     dump_symbols (abfd, TRUE);
+  if (dump_dwarf_section_info)
+    dump_dwarf (abfd);
   if (dump_stab_section_info)
     dump_stabs (abfd);
   if (dump_reloc_info && ! disassemble)
@@ -2819,7 +2939,7 @@ main (int argc, char **argv)
   bfd_init ();
   set_default_bfd_target ();
 
-  while ((c = getopt_long (argc, argv, "pib:m:M:VvCdDlfaHhrRtTxsSI:j:wE:zgeG",
+  while ((c = getopt_long (argc, argv, "pib:m:M:VvCdDlfaHhrRtTxsSI:j:wE:zgeGW",
                           long_options, (int *) 0))
         != EOF)
     {
@@ -2960,6 +3080,20 @@ main (int argc, char **argv)
          do_demangle = TRUE;
          seenflag = TRUE;
          break;
+       case 'W':
+         dump_dwarf_section_info = TRUE;
+         seenflag = TRUE;
+         do_debug_info = 1;
+         do_debug_abbrevs = 1;
+         do_debug_lines = 1;
+         do_debug_pubnames = 1;
+         do_debug_aranges = 1;
+         do_debug_ranges = 1;
+         do_debug_frames = 1;
+         do_debug_macinfo = 1;
+         do_debug_str = 1;
+         do_debug_loc = 1;
+         break;
        case 'G':
          dump_stab_section_info = TRUE;
          seenflag = TRUE;