aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2014-06-26 09:12:55 +0100
committerNick Clifton <nickc@redhat.com>2014-06-26 09:12:55 +0100
commit60d77146a249ae9b51d7ce98930cdbedb2cfa352 (patch)
tree02e416e82daead570e6fd843e191f00e6f28688f
parent4395285e33e6d67c8a82db744ebfd041034b005a (diff)
downloadgdb-60d77146a249ae9b51d7ce98930cdbedb2cfa352.zip
gdb-60d77146a249ae9b51d7ce98930cdbedb2cfa352.tar.gz
gdb-60d77146a249ae9b51d7ce98930cdbedb2cfa352.tar.bz2
Fixes a problem displaying the contents of a binary containing corrupt debug
information, specifically a DW_AT_MIPS_linkage_name attribute that has a numeric value rather than a string value. PR binutils/16949 * dwarf2.c (is_str_attr): New function. (find_abstract_instance_name): Use it to determine when an attribute has a string value.
-rw-r--r--bfd/ChangeLog7
-rw-r--r--bfd/dwarf2.c22
2 files changed, 25 insertions, 4 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 9cd00df..ff972a2 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,10 @@
+2014-06-26 Nick Clifton <nickc@redhat.com>
+
+ PR binutils/16949
+ * dwarf2.c (is_str_attr): New function.
+ (find_abstract_instance_name): Use it to determine when an
+ attribute has a string value.
+
2014-06-24 Alan Modra <amodra@gmail.com>
* elf32-ppc.c (ppc_elf_size_dynamic_sections): Arrange to keep
diff --git a/bfd/dwarf2.c b/bfd/dwarf2.c
index 5e322ce..583504b 100644
--- a/bfd/dwarf2.c
+++ b/bfd/dwarf2.c
@@ -911,6 +911,14 @@ read_abbrevs (bfd *abfd, bfd_uint64_t offset, struct dwarf2_debug *stash)
return abbrevs;
}
+/* Returns true if the form is one which has a string value. */
+
+static inline bfd_boolean
+is_str_attr (enum dwarf_form form)
+{
+ return form == DW_FORM_string || form == DW_FORM_strp || form == DW_FORM_GNU_strp_alt;
+}
+
/* Read an attribute value described by an attribute form. */
static bfd_byte *
@@ -2201,7 +2209,7 @@ find_abstract_instance_name (struct comp_unit *unit,
case DW_AT_name:
/* Prefer DW_AT_MIPS_linkage_name or DW_AT_linkage_name
over DW_AT_name. */
- if (name == NULL)
+ if (name == NULL && is_str_attr (attr.form))
name = attr.u.str;
break;
case DW_AT_specification:
@@ -2209,7 +2217,10 @@ find_abstract_instance_name (struct comp_unit *unit,
break;
case DW_AT_linkage_name:
case DW_AT_MIPS_linkage_name:
- name = attr.u.str;
+ /* PR 16949: Corrupt debug info can place
+ non-string forms into these attributes. */
+ if (is_str_attr (attr.name))
+ name = attr.u.str;
break;
default:
break;
@@ -2381,13 +2392,16 @@ scan_unit_for_symbols (struct comp_unit *unit)
case DW_AT_name:
/* Prefer DW_AT_MIPS_linkage_name or DW_AT_linkage_name
over DW_AT_name. */
- if (func->name == NULL)
+ if (func->name == NULL && is_str_attr (attr.form))
func->name = attr.u.str;
break;
case DW_AT_linkage_name:
case DW_AT_MIPS_linkage_name:
- func->name = attr.u.str;
+ /* PR 16949: Corrupt debug info can place
+ non-string forms into these attributes. */
+ if (is_str_attr (attr.form))
+ func->name = attr.u.str;
break;
case DW_AT_low_pc: