[PATCH] Fix gdb crash when setting breakpoint in assembler file compiled by ARM tool chain

Andreas Kaufmann Andreas.Kaufmann@synopsys.com
Mon Apr 8 15:08:00 GMT 2013


Hi!

Here is a patch to fix gdb crash when setting breakpoint in assembler file compiled by ARM tool chain. The detailed problem description and a test case (including elf-file) can be found here:
http://sourceware.org/bugzilla/show_bug.cgi?id=15343

The problem happens in dwarf2read.c file, process_full_comp_unit() function. Please see the following code:

static_block
    = end_symtab_get_static_block (highpc + baseaddr, objfile, 0, 
                                   per_cu->imported_symtabs != NULL);

  /* If the comp unit has DW_AT_ranges, it may have discontiguous ranges.
     Also, DW_AT_ranges may record ranges not belonging to any child DIEs
     (such as virtual method tables).  Record the ranges in STATIC_BLOCK's
     addrmap to help ensure it has an accurate map of pc values belonging to
     this comp unit.  */
  dwarf2_record_block_ranges (cu->dies, static_block, baseaddr, cu);

  symtab = end_symtab_from_static_block (static_block, objfile,
					 SECT_OFF_TEXT (objfile), 0);

The function ' end_symtab_get_static_block()' returns NULL and then gdb crashes inside dwarf2_record_block_ranges() function. 

First, I tried a patch proposed here:
http://sourceware.org/bugzilla/show_bug.cgi?id=14983
It fixed the crash, however, gdb still issued a lot of internal error messages. 

It looks like gdb needs non-NULL 'symtab' in this case. The proposed patch forces creation of 'static_block' inside ' end_symtab_get_static_block'.

Andreas

===================================================================
RCS file: /cvs/src/src/gdb/dwarf2read.c,v
retrieving revision 1.755.2.1
diff -u -p -r1.755.2.1 dwarf2read.c
--- dwarf2read.c        1 Apr 2013 21:11:31 -0000       1.755.2.1
+++ dwarf2read.c        8 Apr 2013 07:00:07 -0000
@@ -7012,8 +7012,7 @@ process_full_comp_unit (struct dwarf2_pe
   get_scope_pc_bounds (cu->dies, &lowpc, &highpc, cu);
 
   static_block
-    = end_symtab_get_static_block (highpc + baseaddr, objfile, 0,
-                                  per_cu->imported_symtabs != NULL);
+    = end_symtab_get_static_block (highpc + baseaddr, objfile, 0, 1);
 
   /* If the comp unit has DW_AT_ranges, it may have discontiguous ranges.
      Also, DW_AT_ranges may record ranges not belonging to any child DIEs





More information about the Gdb-patches mailing list