[binutils-gdb] Re: PR28149, debug info with wrong file association

Alan Modra amodra@sourceware.org
Mon Sep 20 02:55:57 GMT 2021


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

commit 5b4846283c3d49138a58a3bb4d61ed3e2dfffff4
Author: Alan Modra <amodra@gmail.com>
Date:   Mon Sep 20 11:30:41 2021 +0930

    Re: PR28149, debug info with wrong file association
    
    Fixes segfaults when building aarch64-linux kernel, due to only doing
    part of the work necessary when allocating file numbers late.  I'd
    missed looping over subsegments, which resulted in some u.filename
    entries left around and later interpreted as u.view.
    
            PR 28149
            * dwarf2dbg.c (purge_generated_debug): Iterate over subsegs too.
            (dwarf2_finish): Call do_allocate_filenum for all subsegs too,
            in a separate loop before subsegs are chained.

Diff:
---
 gas/dwarf2dbg.c | 36 +++++++++++++++++++++++-------------
 1 file changed, 23 insertions(+), 13 deletions(-)

diff --git a/gas/dwarf2dbg.c b/gas/dwarf2dbg.c
index 1250fcef54f..e2abe19c88a 100644
--- a/gas/dwarf2dbg.c
+++ b/gas/dwarf2dbg.c
@@ -792,19 +792,23 @@ purge_generated_debug (void)
 
   for (s = all_segs; s; s = s->next)
     {
-      struct line_subseg *lss = s->head;
-      struct line_entry *e, *next;
+      struct line_subseg *lss;
 
-      for (e = lss->head; e; e = next)
+      for (lss = s->head; lss; lss = lss->next)
 	{
-	  know (e->loc.filenum == -1u);
-	  next = e->next;
-	  free (e);
-	}
+	  struct line_entry *e, *next;
+
+	  for (e = lss->head; e; e = next)
+	    {
+	      know (e->loc.filenum == -1u);
+	      next = e->next;
+	      free (e);
+	    }
 
-      lss->head = NULL;
-      lss->ptail = &lss->head;
-      lss->pmove_tail = &lss->head;
+	  lss->head = NULL;
+	  lss->ptail = &lss->head;
+	  lss->pmove_tail = &lss->head;
+	}
     }
 }
 
@@ -2887,15 +2891,21 @@ dwarf2_finish (void)
 			     SEC_READONLY | SEC_DEBUGGING | SEC_OCTETS);
     }
 
+  for (s = all_segs; s; s = s->next)
+    {
+      struct line_subseg *lss;
+
+      for (lss = s->head; lss; lss = lss->next)
+	if (lss->head)
+	  do_allocate_filenum (lss->head);
+    }
+
   /* For each subsection, chain the debug entries together.  */
   for (s = all_segs; s; s = s->next)
     {
       struct line_subseg *lss = s->head;
       struct line_entry **ptail = lss->ptail;
 
-      if (lss->head && SEG_NORMAL (s->seg))
-	do_allocate_filenum (lss->head);
-
       /* Reset the initial view of the first subsection of the
 	 section.  */
       if (lss->head && lss->head->loc.u.view)


More information about the Binutils-cvs mailing list