This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
PATCH: PR binutils/14420: readelf fails to display null bytes in DWARF info
- From: "H.J. Lu" <hongjiu dot lu at intel dot com>
- To: binutils at sourceware dot org
- Date: Tue, 31 Jul 2012 14:05:41 -0700
- Subject: PATCH: PR binutils/14420: readelf fails to display null bytes in DWARF info
- Reply-to: "H.J. Lu" <hjl dot tools at gmail dot com>
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: