When processing large files it is useful to know the DIE offset if printing of attributes fails (especially when redirecting the output). With this change the error message looks like:
eu-readelf: DIE [2aeb8ef1] cannot get attribute value: invalid DWARF Signed-off-by: Mark Wielaard <m...@klomp.org> --- src/ChangeLog | 4 ++++ src/readelf.c | 16 ++++++++++------ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 0d3bfc1..ba7d46d 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,7 @@ +2017-10-03 Mark Wielaard <m...@klomp.org> + + * readelf.c (attr_callback): Print DIE offset in error messages. + 2017-09-10 Mark Wielaard <m...@klomp.org> * ar.c (do_oper_delete): Remove DEBUG conditional check. diff --git a/src/readelf.c b/src/readelf.c index 5e2f3fc..16d2033 100644 --- a/src/readelf.c +++ b/src/readelf.c @@ -5934,13 +5934,15 @@ attr_callback (Dwarf_Attribute *attrp, void *arg) { struct attrcb_args *cbargs = (struct attrcb_args *) arg; const int level = cbargs->level; + Dwarf_Die *die = cbargs->die; unsigned int attr = dwarf_whatattr (attrp); if (unlikely (attr == 0)) { if (!cbargs->silent) - error (0, 0, gettext ("cannot get attribute code: %s"), - dwarf_errmsg (-1)); + error (0, 0, gettext ("DIE [%" PRIx64 "] " + "cannot get attribute code: %s"), + dwarf_dieoffset (die), dwarf_errmsg (-1)); return DWARF_CB_ABORT; } @@ -5948,8 +5950,9 @@ attr_callback (Dwarf_Attribute *attrp, void *arg) if (unlikely (form == 0)) { if (!cbargs->silent) - error (0, 0, gettext ("cannot get attribute form: %s"), - dwarf_errmsg (-1)); + error (0, 0, gettext ("DIE [%" PRIx64 "] " + "cannot get attribute form: %s"), + dwarf_dieoffset (die), dwarf_errmsg (-1)); return DWARF_CB_ABORT; } @@ -5963,8 +5966,9 @@ attr_callback (Dwarf_Attribute *attrp, void *arg) { attrval_out: if (!cbargs->silent) - error (0, 0, gettext ("cannot get attribute value: %s"), - dwarf_errmsg (-1)); + error (0, 0, gettext ("DIE [%" PRIx64 "] " + "cannot get attribute value: %s"), + dwarf_dieoffset (die), dwarf_errmsg (-1)); return DWARF_CB_ABORT; } char *a = format_dwarf_addr (cbargs->dwflmod, cbargs->addrsize, -- 1.8.3.1