diff options
Diffstat (limited to 'binutils/objdump.c')
-rw-r--r-- | binutils/objdump.c | 74 |
1 files changed, 56 insertions, 18 deletions
diff --git a/binutils/objdump.c b/binutils/objdump.c index 98c316a..1a1e32f 100644 --- a/binutils/objdump.c +++ b/binutils/objdump.c @@ -214,11 +214,11 @@ 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[lLiaprmfFsoRt] or\n\ + -W[lLiaprmfFsoRtUuTgAckK] or\n\ --dwarf[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\ =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\ =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\ - =addr,=cu_index]\n\ + =addr,=cu_index,=links,=follow-links]\n\ 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\ @@ -348,10 +348,10 @@ static struct option long_options[]= {"prefix", required_argument, NULL, OPTION_PREFIX}, {"prefix-strip", required_argument, NULL, OPTION_PREFIX_STRIP}, {"insn-width", required_argument, NULL, OPTION_INSN_WIDTH}, - {"dwarf-depth", required_argument, 0, OPTION_DWARF_DEPTH}, - {"dwarf-start", required_argument, 0, OPTION_DWARF_START}, - {"dwarf-check", no_argument, 0, OPTION_DWARF_CHECK}, - {"inlines", no_argument, 0, OPTION_INLINES}, + {"dwarf-depth", required_argument, 0, OPTION_DWARF_DEPTH}, + {"dwarf-start", required_argument, 0, OPTION_DWARF_START}, + {"dwarf-check", no_argument, 0, OPTION_DWARF_CHECK}, + {"inlines", no_argument, 0, OPTION_INLINES}, {0, no_argument, 0, 0} }; @@ -2459,19 +2459,23 @@ disassemble_data (bfd *abfd) free (sorted_syms); } -static int +static bfd_boolean load_specific_debug_section (enum dwarf_section_display_enum debug, asection *sec, void *file) { struct dwarf_section *section = &debug_displays [debug].section; bfd *abfd = (bfd *) file; bfd_byte *contents; - bfd_boolean ret; - /* If it is already loaded, do nothing. */ if (section->start != NULL) - return 1; + { + /* If it is already loaded, do nothing. */ + if (streq (section->filename, bfd_get_filename (abfd))) + return TRUE; + free (section->start); + } + section->filename = bfd_get_filename (abfd); section->reloc_info = NULL; section->num_relocs = 0; section->address = bfd_get_section_vma (abfd, sec); @@ -2484,13 +2488,16 @@ load_specific_debug_section (enum dwarf_section_display_enum debug, free_debug_section (debug); printf (_("\nCan't get contents for section '%s'.\n"), section->name); - return 0; + return FALSE; } /* Ensure any string section has a terminating NUL. */ section->start[section->size] = 0; if (is_relocatable && 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, @@ -2503,11 +2510,9 @@ load_specific_debug_section (enum dwarf_section_display_enum debug, free_debug_section (debug); printf (_("\nCan't get contents for section '%s'.\n"), section->name); - return 0; + return FALSE; } - long reloc_size; - reloc_size = bfd_get_reloc_upper_bound (abfd, sec); if (reloc_size > 0) { @@ -2527,7 +2532,7 @@ load_specific_debug_section (enum dwarf_section_display_enum debug, } } - return 1; + return TRUE; } bfd_boolean @@ -2548,7 +2553,7 @@ reloc_at (struct dwarf_section * dsec, dwarf_vma offset) return FALSE; } -int +bfd_boolean load_debug_section (enum dwarf_section_display_enum debug, void *file) { struct dwarf_section *section = &debug_displays [debug].section; @@ -2557,7 +2562,10 @@ load_debug_section (enum dwarf_section_display_enum debug, void *file) /* If it is already loaded, do nothing. */ if (section->start != NULL) - return 1; + { + if (streq (section->filename, bfd_get_filename (abfd))) + return TRUE; + } /* Locate the debug section. */ sec = bfd_get_section_by_name (abfd, section->uncompressed_name); @@ -2570,7 +2578,7 @@ load_debug_section (enum dwarf_section_display_enum debug, void *file) section->name = section->compressed_name; } if (sec == NULL) - return 0; + return FALSE; return load_specific_debug_section (debug, sec, file); } @@ -2606,6 +2614,29 @@ free_debug_section (enum dwarf_section_display_enum debug) section->size = 0; } +void +close_debug_file (void * file) +{ + bfd * abfd = (bfd *) file; + + bfd_close (abfd); +} + +void * +open_debug_file (const char * pathname) +{ + bfd * data; + + data = bfd_openr (pathname, NULL); + if (data == NULL) + return NULL; + + if (! bfd_check_format (data, bfd_object)) + return NULL; + + return data; +} + static void dump_dwarf_section (bfd *abfd, asection *section, void *arg ATTRIBUTE_UNUSED) @@ -2648,6 +2679,8 @@ dump_dwarf_section (bfd *abfd, asection *section, static void dump_dwarf (bfd *abfd) { + bfd * separates; + is_relocatable = (abfd->flags & (EXEC_P | DYNAMIC)) == 0; eh_addr_size = bfd_arch_bits_per_address (abfd) / 8; @@ -2700,8 +2733,13 @@ dump_dwarf (bfd *abfd) break; } + separates = load_separate_debug_file (abfd, bfd_get_filename (abfd)); + bfd_map_over_sections (abfd, dump_dwarf_section, NULL); + if (separates) + bfd_map_over_sections (separates, dump_dwarf_section, NULL); + free_debug_memory (); } |