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

Tom de Vries vries@sourceware.org
Wed Feb 10 11:30:49 GMT 2021


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=52ff20fe7ba8e8de2660339fff5308ed932e2b32

commit 52ff20fe7ba8e8de2660339fff5308ed932e2b32
Author: Tom de Vries <tdevries@suse.de>
Date:   Wed Feb 10 12:30:46 2021 +0100

    [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.

Diff:
---
 binutils/ChangeLog |  6 ++++++
 binutils/dwarf.c   | 17 ++++++++++++++++-
 2 files changed, 22 insertions(+), 1 deletion(-)

diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index 0e59683d422..1d6b9675dc2 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -1,3 +1,9 @@
+2021-02-10  Tom de Vries  <tdevries@suse.de>
+
+	PR binutils/27371
+	* dwarf.c (display_debug_ranges): Filter range lists according to
+	section.
+
 2021-02-09  Tom de Vries  <tdevries@suse.de>
 
 	PR binutils/27370
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];


More information about the Binutils-cvs mailing list