summaryrefslogtreecommitdiff
path: root/libdw/dwarf_formref_die.c
diff options
context:
space:
mode:
authorMark Wielaard <mark@klomp.org>2018-05-08 15:34:03 +0200
committerMark Wielaard <mark@klomp.org>2018-05-11 17:27:00 +0200
commitaf1438086468f936dfb041daed59a3367fe24a07 (patch)
tree554faa8bbdfd721a9368a94ba377be223eca2a39 /libdw/dwarf_formref_die.c
parent982b6fe9e31683607d476d7f90d1b56cbb78aa21 (diff)
downloadelfutils-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.c15
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);