[binutils] Handle presence of both .debug_ranges and .debug_rnglists

With exec:
...
$ g++ src/gdb/testsuite/gdb.cp/cpexprs.cc -gdwarf-5 -fdebug-types-section
...
I run into:
...
$ readelf -w a.out > READELF
readelf: Error: Invalid range list entry type 126
readelf: Error: Invalid range list entry type 60
...

The executable contains both a .debug_rnglists section (for CU
cpexprs.cc) and a .debug_ranges section (for other CUs, like crti.S).  But
when executing display_debug_ranges for say, section .debug_rnglists it also
tries to use the range list references related to section .debug_ranges.

Fix this by filtering out the .debug_range references when handling
.debug_rnglists and vice versa.

binutils/ChangeLog:

2021-02-10  Tom de Vries  <tdevries@suse.de>

	PR binutils/27371
	* dwarf.c (display_debug_ranges): Filter range lists according to
	section.
This commit is contained in:
Tom de Vries
2021-02-10 12:30:46 +01:00
parent ee4c3d8801
commit 52ff20fe7b
2 changed files with 22 additions and 1 deletions

View File

@@ -7673,7 +7673,15 @@ display_debug_ranges (struct dwarf_section *section,
num_range_list = 0;
for (i = 0; i < num_debug_info_entries; i++)
num_range_list += debug_information [i].num_range_lists;
{
if (debug_information [i].dwarf_version < 5 && is_rnglists)
/* Skip .debug_rnglists reference. */
continue;
if (debug_information [i].dwarf_version >= 5 && !is_rnglists)
/* Skip .debug_range reference. */
continue;
num_range_list += debug_information [i].num_range_lists;
}
if (num_range_list == 0)
{
@@ -7692,6 +7700,13 @@ display_debug_ranges (struct dwarf_section *section,
debug_info *debug_info_p = &debug_information[i];
unsigned int j;
if (debug_information [i].dwarf_version < 5 && is_rnglists)
/* Skip .debug_rnglists reference. */
continue;
if (debug_information [i].dwarf_version >= 5 && !is_rnglists)
/* Skip .debug_range reference. */
continue;
for (j = 0; j < debug_info_p->num_range_lists; j++)
{
range_entry_fill->ranges_offset = debug_info_p->range_lists[j];