From 3c23d7075af603d1cb8ed5e66f1659c46ec85dc7 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Sat, 13 Feb 2021 23:34:55 +0100 Subject: [PATCH] Don't handle blocks as exprlocs for DWARF version 4 or higher. Since DWARF version 4 blocks just contain bytes, trying to interpret them as exprlocs will most likely fail. * dwz.c (add_locexpr_dummy_dies): Only handle block as exprloc for cu_version < 4. (checksum_die): Likewise. (write_die): Likewise. https://sourceware.org/bugzilla/show_bug.cgi?id=26987 --- dwz.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/dwz.c b/dwz.c index d6b9df0..5f0cc1d 100644 --- a/dwz.c +++ b/dwz.c @@ -2910,7 +2910,7 @@ add_locexpr_dummy_dies (DSO *dso, dw_cu_ref cu, dw_die_ref die, unsigned char *ptr, uint32_t form, unsigned int attr, size_t len) { - if (form == DW_FORM_block1) + if (form == DW_FORM_block1 && cu->cu_version < 4) { /* Old DWARF uses blocks instead of exprlocs. */ switch (attr) @@ -3733,7 +3733,7 @@ checksum_die (DSO *dso, dw_cu_ref cu, dw_die_ref top_die, dw_die_ref die) abort (); } - if (form == DW_FORM_block1) + if (form == DW_FORM_block1 && cu->cu_version < 4) { /* Old DWARF uses blocks instead of exprlocs. */ switch (t->attr[i].attr) @@ -3782,6 +3782,11 @@ checksum_die (DSO *dso, dw_cu_ref cu, dw_die_ref top_die, dw_die_ref die) } ptr += len; } + else if (form == DW_FORM_block1) + { + /* DWARF4 or higher, handle block as an opaque block of bytes. */ + ptr += len; + } else if (form == DW_FORM_exprloc) { if (die->die_ck_state != CK_BAD) @@ -12392,7 +12397,7 @@ write_die (unsigned char *ptr, dw_cu_ref cu, dw_die_ref die, ptr += inptr - orig_ptr; /* Old DWARF uses blocks instead of exprlocs. */ - if (form == DW_FORM_block1) + if (form == DW_FORM_block1 && cu->cu_version < 4) switch (reft->attr[i].attr) { case DW_AT_frame_base: -- 2.18.4