public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
* PATCH: PR binutils/14420: readelf fails to display null bytes in DWARF info
@ 2012-07-31 21:05 H.J. Lu
  2012-08-02  8:41 ` nick clifton
  0 siblings, 1 reply; 2+ messages in thread
From: H.J. Lu @ 2012-07-31 21:05 UTC (permalink / raw)
  To: binutils

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:
 

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: PATCH: PR binutils/14420: readelf fails to display null bytes in DWARF info
  2012-07-31 21:05 PATCH: PR binutils/14420: readelf fails to display null bytes in DWARF info H.J. Lu
@ 2012-08-02  8:41 ` nick clifton
  0 siblings, 0 replies; 2+ messages in thread
From: nick clifton @ 2012-08-02  8:41 UTC (permalink / raw)
  To: H.J. Lu; +Cc: H.J. Lu, binutils

Hi H.J.

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

Patch approved.

Cheers
   Nick




^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2012-08-02  8:41 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-07-31 21:05 PATCH: PR binutils/14420: readelf fails to display null bytes in DWARF info H.J. Lu
2012-08-02  8:41 ` nick clifton

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).