This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

PATCH: PR binutils/14420: readelf fails to display null bytes in DWARF info


Hi,

Null bytes are used to terminate list and table in DWARF debug info.  This
patch displays null bytes in DWARF debug info so that one can tell if
DWARF debug info is properly terminated.


H.J.
--
diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index 7634de4..c4eda98 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -1,3 +1,13 @@
+2012-07-31  H.J. Lu  <hongjiu.lu@intel.com>
+
+	PR binutils/14420
+	* dwarf.c (process_abbrev_section): Add attribute terminator.
+	Warn missing section terminator.
+	(get_FORM_name): Special check for 0 value.
+	(get_AT_name): Likewise.
+	(process_debug_info): Display zero abbrev number.  Check
+	attribute terminator.
+
 2012-07-30  Nick Clifton  <nickc@redhat.com>
 
 	* po/binutils.pot: Updated template.
diff --git a/binutils/dwarf.c b/binutils/dwarf.c
index 6e93906..72aa2aa 100644
--- a/binutils/dwarf.c
+++ b/binutils/dwarf.c
@@ -647,12 +647,14 @@ process_abbrev_section (unsigned char *start, unsigned char *end)
 	  form = read_leb128 (start, & bytes_read, 0);
 	  start += bytes_read;
 
-	  if (attribute != 0)
-	    add_abbrev_attr (attribute, form);
+	  add_abbrev_attr (attribute, form);
 	}
       while (attribute != 0);
     }
 
+  /* Report the missing single zero which ends the section.  */
+  error (_(".debug_abbrev section not zero terminated\n"));
+
   return NULL;
 }
 
@@ -675,8 +677,12 @@ get_TAG_name (unsigned long tag)
 static const char *
 get_FORM_name (unsigned long form)
 {
-  const char *name = get_DW_FORM_name (form);
+  const char *name;
+  
+  if (form == 0)
+    return "DW_FORM value: 0";
 
+  name = get_DW_FORM_name (form);
   if (name == NULL)
     {
       static char buffer[100];
@@ -1860,6 +1866,9 @@ get_AT_name (unsigned long attribute)
 {
   const char *name;
 
+  if (attribute == 0)
+    return "DW_AT value: 0";
+
   /* One value is shared by the MIPS and HP extensions:  */
   if (attribute == DW_AT_MIPS_fde)
     return "DW_AT_MIPS_fde or DW_AT_HP_unmodifiable";
@@ -2161,6 +2170,13 @@ process_debug_info (struct dwarf_section *section,
 		    break;
 		}
 
+	      if (!do_loc && die_offset >= dwarf_start_die)
+		{
+		  printf (_(" <%d><%lx>: Abbrev Number: 0\n"),
+			  level, die_offset);
+		  die_offset++;
+		}
+
 	      --level;
 	      if (level < 0)
 		{
@@ -2238,7 +2254,9 @@ process_debug_info (struct dwarf_section *section,
 	      break;
 	    }
 
-	  for (attr = entry->first_attr; attr; attr = attr->next)
+	  for (attr = entry->first_attr;
+	       attr && attr->attribute;
+	       attr = attr->next)
 	    {
 	      debug_info *arg;
 
diff --git a/binutils/testsuite/ChangeLog b/binutils/testsuite/ChangeLog
index b82624a..c021e28 100644
--- a/binutils/testsuite/ChangeLog
+++ b/binutils/testsuite/ChangeLog
@@ -1,3 +1,11 @@
+2012-07-31  H.J. Lu  <hongjiu.lu@intel.com>
+
+	PR binutils/14420
+	* binutils-all/i386/compressed-1a.d: Updated.
+	* binutils-all/objdump.W: Likewise.
+	* binutils-all/readelf.wa: Likewise.
+	* binutils-all/x86-64/compressed-1a.d: Likewise.
+
 2012-07-28  Kai Tietz  <ktietz@redhat.com>
 
 	* binutils-all/windres/version_small.rc: New test.
diff --git a/binutils/testsuite/binutils-all/i386/compressed-1a.d b/binutils/testsuite/binutils-all/i386/compressed-1a.d
index aa0284a..bb609dd 100644
--- a/binutils/testsuite/binutils-all/i386/compressed-1a.d
+++ b/binutils/testsuite/binutils-all/i386/compressed-1a.d
@@ -16,6 +16,7 @@ Contents of the .[z]?debug_abbrev section:
     DW_AT_low_pc       DW_FORM_addr
     DW_AT_high_pc      DW_FORM_addr
     DW_AT_stmt_list    DW_FORM_data4
+    DW_AT value: 0     DW_FORM value: 0
    2      DW_TAG_subprogram    \[no children\]
     DW_AT_external     DW_FORM_flag
     DW_AT_name         DW_FORM_strp
@@ -24,6 +25,7 @@ Contents of the .[z]?debug_abbrev section:
     DW_AT_low_pc       DW_FORM_addr
     DW_AT_high_pc      DW_FORM_addr
     DW_AT_frame_base   DW_FORM_block1
+    DW_AT value: 0     DW_FORM value: 0
 
 Contents of the .[z]?debug_info section:
 
@@ -56,6 +58,7 @@ Contents of the .[z]?debug_info section:
     <3f>   DW_AT_low_pc      : 0x10	
     <43>   DW_AT_high_pc     : 0x1b	
     <47>   DW_AT_frame_base  : 1 byte block: 9c 	\(DW_OP_call_frame_cfa\)
+ <1><49>: Abbrev Number: 0
 
 Raw dump of debug contents of section .[z]?debug_line:
 
diff --git a/binutils/testsuite/binutils-all/objdump.W b/binutils/testsuite/binutils-all/objdump.W
index 449372e..43c2451 100644
--- a/binutils/testsuite/binutils-all/objdump.W
+++ b/binutils/testsuite/binutils-all/objdump.W
@@ -28,6 +28,7 @@ Contents of the .debug_info section:
     <4b>   DW_AT_name        : int	
     <4f>   DW_AT_byte_size   : 4	
     <50>   DW_AT_encoding    : 5	\(signed\)
+ <1><51>: Abbrev Number: 0
 
 Raw dump of debug contents of section .debug_line:
 
@@ -83,6 +84,7 @@ Contents of the .debug_abbrev section:
     DW_AT_name         DW_FORM_string
     DW_AT_producer     DW_FORM_string
     DW_AT_language     DW_FORM_data1
+    DW_AT value: 0     DW_FORM value: 0
    2      DW_TAG_subprogram    \[no children\]
     DW_AT_external     DW_FORM_flag
     DW_AT_decl_file    DW_FORM_data1
@@ -92,8 +94,10 @@ Contents of the .debug_abbrev section:
     DW_AT_low_pc       DW_FORM_addr
     DW_AT_high_pc      DW_FORM_addr
     DW_AT_frame_base   DW_FORM_block1
+    DW_AT value: 0     DW_FORM value: 0
    3      DW_TAG_base_type    \[no children\]
     DW_AT_name         DW_FORM_string
     DW_AT_byte_size    DW_FORM_data1
     DW_AT_encoding     DW_FORM_data1
+    DW_AT value: 0     DW_FORM value: 0
 
diff --git a/binutils/testsuite/binutils-all/readelf.wa b/binutils/testsuite/binutils-all/readelf.wa
index e1e158c..43d60b1 100644
--- a/binutils/testsuite/binutils-all/readelf.wa
+++ b/binutils/testsuite/binutils-all/readelf.wa
@@ -8,6 +8,7 @@ Contents of the .zdebug_abbrev section:
     DW_AT_name         DW_FORM_string
     DW_AT_producer     DW_FORM_string
     DW_AT_language     DW_FORM_data1
+    DW_AT value: 0     DW_FORM value: 0
    2      DW_TAG_subprogram    [no children]
     DW_AT_external     DW_FORM_flag
     DW_AT_decl_file    DW_FORM_data1
@@ -17,8 +18,10 @@ Contents of the .zdebug_abbrev section:
     DW_AT_low_pc       DW_FORM_addr
     DW_AT_high_pc      DW_FORM_addr
     DW_AT_frame_base   DW_FORM_block1
+    DW_AT value: 0     DW_FORM value: 0
    3      DW_TAG_base_type    [no children]
     DW_AT_name         DW_FORM_string
     DW_AT_byte_size    DW_FORM_data1
     DW_AT_encoding     DW_FORM_data1
+    DW_AT value: 0     DW_FORM value: 0
 
diff --git a/binutils/testsuite/binutils-all/x86-64/compressed-1a.d b/binutils/testsuite/binutils-all/x86-64/compressed-1a.d
index 98115af..06ab011 100644
--- a/binutils/testsuite/binutils-all/x86-64/compressed-1a.d
+++ b/binutils/testsuite/binutils-all/x86-64/compressed-1a.d
@@ -16,6 +16,7 @@ Contents of the .[z]?debug_abbrev section:
     DW_AT_low_pc       DW_FORM_addr
     DW_AT_high_pc      DW_FORM_addr
     DW_AT_stmt_list    DW_FORM_data4
+    DW_AT value: 0     DW_FORM value: 0
    2      DW_TAG_subprogram    \[no children\]
     DW_AT_external     DW_FORM_flag
     DW_AT_name         DW_FORM_strp
@@ -24,6 +25,7 @@ Contents of the .[z]?debug_abbrev section:
     DW_AT_low_pc       DW_FORM_addr
     DW_AT_high_pc      DW_FORM_addr
     DW_AT_frame_base   DW_FORM_block1
+    DW_AT value: 0     DW_FORM value: 0
 
 Contents of the .[z]?debug_info section:
 
@@ -56,6 +58,7 @@ Contents of the .[z]?debug_info section:
     <4f>   DW_AT_low_pc      : 0x10	
     <57>   DW_AT_high_pc     : 0x15	
     <5f>   DW_AT_frame_base  : 1 byte block: 9c 	\(DW_OP_call_frame_cfa\)
+ <1><61>: Abbrev Number: 0
 
 Raw dump of debug contents of section .[z]?debug_line:
 
diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog
index 6957712..4e43e4c 100644
--- a/gas/testsuite/ChangeLog
+++ b/gas/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+2012-07-31  H.J. Lu  <hongjiu.lu@intel.com>
+
+	PR binutils/14420
+	* gas/elf/dwarf2-1.d: Updated.
+	* gas/elf/dwarf2-2.d: Likwise.
+	* gas/i386/dw2-compress-1.d: Likwise.
+
 2012-07-30  H.J. Lu  <hongjiu.lu@intel.com>
 
 	* gas/i386/inval-equ-2.l: Updated.
diff --git a/gas/testsuite/gas/elf/dwarf2-1.d b/gas/testsuite/gas/elf/dwarf2-1.d
index ff0ff74..1a6b0ca 100644
--- a/gas/testsuite/gas/elf/dwarf2-1.d
+++ b/gas/testsuite/gas/elf/dwarf2-1.d
@@ -30,6 +30,7 @@ Contents of the .[z]?debug_info section:
     <4b>   DW_AT_name        : int	
     <4f>   DW_AT_byte_size   : 4	
     <50>   DW_AT_encoding    : 5	\(signed\)
+ <1><51>: Abbrev Number: 0
 
 Raw dump of debug contents of section .[z]?debug_line:
 
@@ -85,6 +86,7 @@ Contents of the .[z]?debug_abbrev section:
     DW_AT_name         DW_FORM_string
     DW_AT_producer     DW_FORM_string
     DW_AT_language     DW_FORM_data1
+    DW_AT value: 0     DW_FORM value: 0
    2      DW_TAG_subprogram    \[no children\]
     DW_AT_external     DW_FORM_flag
     DW_AT_decl_file    DW_FORM_data1
@@ -94,8 +96,10 @@ Contents of the .[z]?debug_abbrev section:
     DW_AT_low_pc       DW_FORM_addr
     DW_AT_high_pc      DW_FORM_addr
     DW_AT_frame_base   DW_FORM_block1
+    DW_AT value: 0     DW_FORM value: 0
    3      DW_TAG_base_type    \[no children\]
     DW_AT_name         DW_FORM_string
     DW_AT_byte_size    DW_FORM_data1
     DW_AT_encoding     DW_FORM_data1
+    DW_AT value: 0     DW_FORM value: 0
 
diff --git a/gas/testsuite/gas/elf/dwarf2-2.d b/gas/testsuite/gas/elf/dwarf2-2.d
index 2feafa6..a463acc 100644
--- a/gas/testsuite/gas/elf/dwarf2-2.d
+++ b/gas/testsuite/gas/elf/dwarf2-2.d
@@ -30,6 +30,7 @@ Contents of the .[z]?debug_info section:
     <4b>   DW_AT_name        : int	
     <4f>   DW_AT_byte_size   : 4	
     <50>   DW_AT_encoding    : 5	\(signed\)
+ <1><51>: Abbrev Number: 0
 
 Raw dump of debug contents of section .[z]?debug_line:
 
@@ -85,6 +86,7 @@ Contents of the .[z]?debug_abbrev section:
     DW_AT_name         DW_FORM_string
     DW_AT_producer     DW_FORM_string
     DW_AT_language     DW_FORM_data1
+    DW_AT value: 0     DW_FORM value: 0
    2      DW_TAG_subprogram    \[no children\]
     DW_AT_external     DW_FORM_flag
     DW_AT_decl_file    DW_FORM_data1
@@ -94,8 +96,10 @@ Contents of the .[z]?debug_abbrev section:
     DW_AT_low_pc       DW_FORM_addr
     DW_AT_high_pc      DW_FORM_addr
     DW_AT_frame_base   DW_FORM_block1
+    DW_AT value: 0     DW_FORM value: 0
    3      DW_TAG_base_type    \[no children\]
     DW_AT_name         DW_FORM_string
     DW_AT_byte_size    DW_FORM_data1
     DW_AT_encoding     DW_FORM_data1
+    DW_AT value: 0     DW_FORM value: 0
 
diff --git a/gas/testsuite/gas/i386/dw2-compress-1.d b/gas/testsuite/gas/i386/dw2-compress-1.d
index 06057ca..64e2559 100644
--- a/gas/testsuite/gas/i386/dw2-compress-1.d
+++ b/gas/testsuite/gas/i386/dw2-compress-1.d
@@ -29,6 +29,7 @@ Contents of the .zdebug_info section:
     <4b>   DW_AT_name        : int	
     <4f>   DW_AT_byte_size   : 4	
     <50>   DW_AT_encoding    : 5	\(signed\)
+ <1><51>: Abbrev Number: 0
 
 Contents of the .zdebug_abbrev section:
 
@@ -40,6 +41,7 @@ Contents of the .zdebug_abbrev section:
     DW_AT_name         DW_FORM_string
     DW_AT_producer     DW_FORM_string
     DW_AT_language     DW_FORM_data1
+    DW_AT value: 0     DW_FORM value: 0
    2      DW_TAG_subprogram    \[no children\]
     DW_AT_external     DW_FORM_flag
     DW_AT_decl_file    DW_FORM_data1
@@ -49,10 +51,12 @@ Contents of the .zdebug_abbrev section:
     DW_AT_low_pc       DW_FORM_addr
     DW_AT_high_pc      DW_FORM_addr
     DW_AT_frame_base   DW_FORM_block1
+    DW_AT value: 0     DW_FORM value: 0
    3      DW_TAG_base_type    \[no children\]
     DW_AT_name         DW_FORM_string
     DW_AT_byte_size    DW_FORM_data1
     DW_AT_encoding     DW_FORM_data1
+    DW_AT value: 0     DW_FORM value: 0
 
 Raw dump of debug contents of section .zdebug_line:
 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]