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.
This commit is contained in:
H.J. Lu 2005-09-30 14:56:34 +00:00
parent 19e6b90ed8
commit 365544c3f0
4 changed files with 158 additions and 6 deletions

View 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.

View 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

View 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 \

View 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);
}
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 ();
}
/* 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;