From 60d77146a249ae9b51d7ce98930cdbedb2cfa352 Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Thu, 26 Jun 2014 09:12:55 +0100 Subject: [PATCH] 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. --- bfd/ChangeLog | 7 +++++++ bfd/dwarf2.c | 22 ++++++++++++++++++---- 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 + + 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 * 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: -- 2.7.4