[PATCH] readelf, libdw: blocks aren't expressions for DWARF version 4
Mark Wielaard
mark@klomp.org
Fri Feb 12 15:30:28 GMT 2021
For DWARF version 4 or higher a block form really encodes a block,
not an expression location. Also constant offsets can be expressed
as DW_FORM_implicit_const in DWARF version 5.
Signed-off-by: Mark Wielaard <mark@klomp.org>
---
libdw/ChangeLog | 6 ++++++
libdw/dwarf_getlocation.c | 17 +++++++++++++++++
src/ChangeLog | 5 +++++
src/readelf.c | 4 +++-
4 files changed, 31 insertions(+), 1 deletion(-)
diff --git a/libdw/ChangeLog b/libdw/ChangeLog
index b8038f00..f01bee39 100644
--- a/libdw/ChangeLog
+++ b/libdw/ChangeLog
@@ -1,3 +1,9 @@
+2021-02-12 Mark Wielaard <mark@klomp.org>
+
+ * dwarf_getlocation.c (attr_ok): For DWARF version 4 or higher
+ block forms are not expression locations.
+ (is_constant_offset): DW_FORM_implicit_const is also a constant.
+
2020-12-20 Dmitry V. Levin <ldv@altlinux.org>
* .gitignore: New file.
diff --git a/libdw/dwarf_getlocation.c b/libdw/dwarf_getlocation.c
index 4e582db2..5db3cf97 100644
--- a/libdw/dwarf_getlocation.c
+++ b/libdw/dwarf_getlocation.c
@@ -48,6 +48,22 @@ attr_ok (Dwarf_Attribute *attr)
if (dwarf_whatform (attr) == DW_FORM_exprloc)
return true;
+ if (attr->cu->version >= 4)
+ {
+ /* Must be an exprloc (or constant), just not any block form. */
+ switch (dwarf_whatform (attr))
+ {
+ case DW_FORM_block:
+ case DW_FORM_block1:
+ case DW_FORM_block2:
+ case DW_FORM_block4:
+ __libdw_seterrno (DWARF_E_NO_LOC_VALUE);
+ return false;
+ default:
+ break;
+ }
+ }
+
/* Otherwise must be one of the attributes listed below. Older
DWARF versions might have encoded the exprloc as block, and we
cannot easily distinguish attributes in the loclist class because
@@ -186,6 +202,7 @@ is_constant_offset (Dwarf_Attribute *attr,
case DW_FORM_data8:
case DW_FORM_sdata:
case DW_FORM_udata:
+ case DW_FORM_implicit_const:
break;
}
diff --git a/src/ChangeLog b/src/ChangeLog
index e65620fd..61cd98f4 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,8 @@
+2021-02-12 Mark Wielaard <mark@klomp.org>
+
+ * readelf.c (attr_callback): Don't handle blocks as expression
+ blocks for DWARF version 4 or higher.
+
2021-02-03 Timm Bäder <tbaeder@redhat.com>
* ar.c (do_oper_extract): Extract should_truncate_fname function
diff --git a/src/readelf.c b/src/readelf.c
index 11692bb5..9d2a25a4 100644
--- a/src/readelf.c
+++ b/src/readelf.c
@@ -7599,7 +7599,9 @@ attr_callback (Dwarf_Attribute *attrp, void *arg)
case DW_AT_GNU_call_site_data_value:
case DW_AT_GNU_call_site_target:
case DW_AT_GNU_call_site_target_clobbered:
- if (form != DW_FORM_data16)
+ if (form == DW_FORM_exprloc
+ || (form != DW_FORM_data16
+ && attrp->cu->version < 4)) /* blocks were expressions. */
{
putchar ('\n');
print_ops (cbargs->dwflmod, cbargs->dbg,
--
2.18.4
More information about the Elfutils-devel
mailing list