Extend readelf and objdump so that they will display and follow multiple links to separate debug information files.

PR 23843
	* dwarf.h (struct separate_info): New structure for containing
	information on separate debug info files.
	* dwarf.c (struct dwo_info): New structure for containing dwo
	links.
	(first_dwo_info): Chain of dwo_info structures.
	(first_separate_file): Chain of separate_info structures.
	(separate_debug_file, separate_debug_filename): Delete.
	(fetch_alt_indirect_string): Scan all separate debug info files
	for the requested string.
	(add_dwo_info): New function.
	(add_dwo_name): New function.
	(add_dwo_dir): New function.
	(add_dwo_id: New function.
	(free_dwo_info): New function.
	(read_and_display_attr_value): Store DWO data using the new
	functions.
	(load_debug_section_with_follow): If necessary, scan the list of
	separate debug info files for the requested section.
	(add_separate_debug_file): New function.
	(load_separate_debug_info): Call add_separate_debug_file to store
	the information on the newly loaded file.
	(load_dwo_file): Likewise.
	(load_separate_debif_file): Rename to load_separate_debug_files.
	Change return type to boolean.  If following links then attempt to
	load all separate debug info files, not just the first one.
	(free_debug_memory): Release memory in dwo_info and separate_info
	chains.
	* objdump.c (dump_dwarf): Iterate over all loaded debg info files.
	* readelf.c (process_object): Likewise.
	* doc/debug.options.texi: Update descriptions of links and
	follow-links options.
	* testsuite/binutils-all/objdump.WK2: Update expected output.
	* testsuite/binutils-all/readelf.k2: Likewise.
	* NEWS: Announce the new feature.
This commit is contained in:
Nick Clifton 2019-02-22 10:36:24 +00:00
parent 83f43c8344
commit 24841daa74
9 changed files with 381 additions and 187 deletions

View file

@ -2882,7 +2882,7 @@ dump_dwarf_section (bfd *abfd, asection *section,
static void
dump_dwarf (bfd *abfd)
{
bfd * separates;
bfd_boolean have_separates;
is_relocatable = (abfd->flags & (EXEC_P | DYNAMIC)) == 0;
@ -2946,12 +2946,19 @@ dump_dwarf (bfd *abfd)
break;
}
separates = load_separate_debug_file (abfd, bfd_get_filename (abfd));
have_separates = load_separate_debug_files (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);
if (have_separates)
{
separate_info * i;
for (i = first_separate_info; i != NULL; i = i->next)
bfd_map_over_sections (i->handle, dump_dwarf_section, NULL);
/* The file handles are closed by the call to free_debug_memory() below. */
}
free_debug_memory ();
}