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.
This commit is contained in:
Nick Clifton 2014-06-26 09:12:55 +01:00
parent 4395285e33
commit 60d77146a2
2 changed files with 25 additions and 4 deletions

View File

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

View File

@ -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,6 +2217,9 @@ find_abstract_instance_name (struct comp_unit *unit,
break;
case DW_AT_linkage_name:
case DW_AT_MIPS_linkage_name:
/* 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:
@ -2381,12 +2392,15 @@ 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:
/* 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;