Handle presence of both .debug_ranges and .debug_rnglists

Message ID 438b3286-33b3-2449-5d68-f83fe1baede8@suse.de
State New
Headers show
Series
  • Handle presence of both .debug_ranges and .debug_rnglists
Related show

Commit Message

Tom de Vries Feb. 10, 2021, 9:42 a.m.
[ was: Re: [PATCH][binutils] Fix debug_rnglists test in
display_debug_ranges ]
On 2/10/21 4:54 AM, Alan Modra wrote:
> On Tue, Feb 09, 2021 at 05:56:54PM +0100, Tom de Vries wrote:

>> --- a/binutils/dwarf.c

>> +++ b/binutils/dwarf.c

>> @@ -7581,7 +7581,7 @@ display_debug_ranges (struct dwarf_section *section,

>>    unsigned char *finish = start + bytes;

>>    unsigned int num_range_list, i;

>>    struct range_entry *range_entries, *range_entry_fill;

>> -  int is_rnglists = strstr (section->name, "debug_rnglists") != NULL;

>> +  int is_rnglists = strstr (section->name, ".debug_rnglists") != NULL;

>>    /* Initialize it due to a false compiler warning.  */

>>    unsigned char address_size = 0;

>>    dwarf_vma last_offset = 0;

> 

> I must be having a slow brain day, but I don't see what the above is

> doing besides making .zdebug_rnglists not match.  Isn't the whole

> point of using strstr here to allow the compressed section prefix?

> 


Hi Alan,

thanks for the review.

You're right, this modification is not necessary to fix the problem, and
it has the problematic effect you describe here.

It seems my mind was convinced this was a strcmp...

Fixed in updated patch.  Updated $subject accordingly.

OK for trunk?

Thanks,
- Tom

Comments

Nick Clifton via Binutils Feb. 10, 2021, 11:19 a.m. | #1
On Wed, Feb 10, 2021 at 10:42:12AM +0100, Tom de Vries wrote:
> 	PR binutils/27371

> 	* dwarf.c (display_debug_ranges): Filter range lists according to

> 	section.


OK.

-- 
Alan Modra
Australia Development Lab, IBM

Patch

[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-09  Tom de Vries  <tdevries@suse.de>

	PR binutils/27371
	* dwarf.c (display_debug_ranges): Filter range lists according to
	section.

---
 binutils/dwarf.c | 17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)

diff --git a/binutils/dwarf.c b/binutils/dwarf.c
index d6eb8926dbf..84d63f63366 100644
--- a/binutils/dwarf.c
+++ b/binutils/dwarf.c
@@ -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];