diff options
author | Nick Clifton <nickc@redhat.com> | 2014-06-26 09:12:55 +0100 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2014-06-26 09:12:55 +0100 |
commit | 60d77146a249ae9b51d7ce98930cdbedb2cfa352 (patch) | |
tree | 02e416e82daead570e6fd843e191f00e6f28688f /bfd/dwarf2.c | |
parent | 4395285e33e6d67c8a82db744ebfd041034b005a (diff) | |
download | gdb-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.
Diffstat (limited to 'bfd/dwarf2.c')
-rw-r--r-- | bfd/dwarf2.c | 22 |
1 files changed, 18 insertions, 4 deletions
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: |