-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\
{"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}
};
\f
bfd_vma asz, bsz;
asz = 0;
- if ((a->flags & BSF_SYNTHETIC) == 0)
+ if ((a->flags & (BSF_SECTION_SYM | BSF_SYNTHETIC)) == 0)
asz = ((elf_symbol_type *) a)->internal_elf_sym.st_size;
bsz = 0;
- if ((b->flags & BSF_SYNTHETIC) == 0)
+ if ((b->flags & (BSF_SECTION_SYM | BSF_SYNTHETIC)) == 0)
bsz = ((elf_symbol_type *) b)->internal_elf_sym.st_size;
if (asz != bsz)
return asz > bsz ? -1 : 1;
name = alloc;
}
- if ((sym->flags & BSF_SYNTHETIC) == 0)
+ if ((sym->flags & (BSF_SECTION_SYM | BSF_SYNTHETIC)) == 0)
version_string = bfd_get_symbol_version_string (abfd, sym, &hidden);
if (bfd_is_und_section (bfd_get_section (sym)))
free (sorted_syms);
}
\f
-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_boolean ret;
+ bfd_byte *contents;
- /* 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);
section->size = bfd_get_section_size (sec);
- section->start = NULL;
+ section->start = contents = malloc (section->size + 1);
section->user_data = sec;
- ret = bfd_get_full_section_contents (abfd, sec, §ion->start);
-
- if (! ret)
+ if (section->start == NULL
+ || !bfd_get_full_section_contents (abfd, sec, &contents))
{
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,
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)
{
}
}
- return 1;
+ return TRUE;
}
bfd_boolean
return FALSE;
}
-int
+bfd_boolean
load_debug_section (enum dwarf_section_display_enum debug, void *file)
{
struct dwarf_section *section = &debug_displays [debug].section;
/* 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);
section->name = section->compressed_name;
}
if (sec == NULL)
- return 0;
+ return FALSE;
return load_specific_debug_section (debug, sec, file);
}
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)
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;
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 ();
}
\f
}
if ((bfd_get_file_flags (abfd) & (BFD_IN_MEMORY | BFD_LINKER_CREATED)) == 0
- && (ufile_ptr) relsize > bfd_get_file_size (abfd))
+ && (((ufile_ptr) relsize > bfd_get_file_size (abfd))
+ /* Also check the section's reloc count since if this is negative
+ (or very large) the computation in bfd_get_reloc_upper_bound
+ may have resulted in returning a small, positive integer.
+ See PR 22508 for a reproducer.
+
+ Note - we check against file size rather than section size as
+ it is possible for there to be more relocs that apply to a
+ section than there are bytes in that section. */
+ || (section->reloc_count > bfd_get_file_size (abfd))))
{
printf (" (too many: 0x%x)\n", section->reloc_count);
bfd_set_error (bfd_error_file_truncated);