diff options
author | Mark Wielaard <mark@klomp.org> | 2018-05-08 15:34:03 +0200 |
---|---|---|
committer | Mark Wielaard <mark@klomp.org> | 2018-05-11 17:27:00 +0200 |
commit | af1438086468f936dfb041daed59a3367fe24a07 (patch) | |
tree | 554faa8bbdfd721a9368a94ba377be223eca2a39 /libdw/dwarf_formref_die.c | |
parent | 982b6fe9e31683607d476d7f90d1b56cbb78aa21 (diff) | |
download | elfutils-af1438086468f936dfb041daed59a3367fe24a07.tar.gz |
libdw: Handle DW_FORM_[ref|strp]_sup[48] as DW_FORM_GNU_[ref|strp]_alt.
Although we don't yet handle DWARF5 supplemental files, they are like
mostly like GNU alt files. This way using any of the supplemental files
will at least generate an appropriate error message.
Signed-off-by: Mark Wielaard <mark@klomp.org>
Diffstat (limited to 'libdw/dwarf_formref_die.c')
-rw-r--r-- | libdw/dwarf_formref_die.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/libdw/dwarf_formref_die.c b/libdw/dwarf_formref_die.c index d47fb2f5..f196331a 100644 --- a/libdw/dwarf_formref_die.c +++ b/libdw/dwarf_formref_die.c @@ -44,13 +44,20 @@ dwarf_formref_die (Dwarf_Attribute *attr, Dwarf_Die *result) struct Dwarf_CU *cu = attr->cu; Dwarf_Off offset; - if (attr->form == DW_FORM_ref_addr || attr->form == DW_FORM_GNU_ref_alt) + if (attr->form == DW_FORM_ref_addr || attr->form == DW_FORM_GNU_ref_alt + || attr->form == DW_FORM_ref_sup4 || attr->form == DW_FORM_ref_sup8) { /* This has an absolute offset. */ - uint8_t ref_size = (cu->version == 2 && attr->form == DW_FORM_ref_addr - ? cu->address_size - : cu->offset_size); + uint8_t ref_size; + if (cu->version == 2 && attr->form == DW_FORM_ref_addr) + ref_size = cu->address_size; + else if (attr->form == DW_FORM_ref_sup4) + ref_size = 4; + else if (attr->form == DW_FORM_ref_sup8) + ref_size = 8; + else + ref_size = cu->offset_size; Dwarf *dbg_ret = (attr->form == DW_FORM_GNU_ref_alt ? INTUSE(dwarf_getalt) (cu->dbg) : cu->dbg); |