commit e23c71330c3b332d19fdf9e48ca8b03680d9ad34 Author: Mark Wielaard Date: Thu Nov 2 16:23:24 2017 +0100 readelf: Handle DW_OP_GNU_variable_value. Also format both DW_OP_call_ref and DW_OP_GNU_variable_value argument as a normal DIE reference. Signed-off-by: Mark Wielaard diff --git a/libdw/dwarf.h b/libdw/dwarf.h index 902d261..8edf719 100644 --- a/libdw/dwarf.h +++ b/libdw/dwarf.h @@ -545,6 +545,7 @@ enum DW_OP_GNU_convert = 0xf7, DW_OP_GNU_reinterpret = 0xf9, DW_OP_GNU_parameter_ref = 0xfa, + DW_OP_GNU_variable_value = 0xfd, DW_OP_lo_user = 0xe0, /* Implementation-defined range start. */ DW_OP_hi_user = 0xff /* Implementation-defined range end. */ diff --git a/src/readelf.c b/src/readelf.c index 5e2f3fc..833884b 100644 --- a/src/readelf.c +++ b/src/readelf.c @@ -4160,6 +4160,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, break; case DW_OP_call_ref: + case DW_OP_GNU_variable_value: /* Offset operand. */ if (ref_size != 4 && ref_size != 8) goto invalid; /* Cannot be used in CFA. */ @@ -4170,8 +4171,8 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, addr = read_8ubyte_unaligned (dbg, data); data += ref_size; CONSUME (ref_size); - - printf ("%*s[%4" PRIuMAX "] %s %#" PRIxMAX "\n", + /* addr is a DIE offset, so format it as one. */ + printf ("%*s[%4" PRIuMAX "] %s [%6" PRIxMAX "]\n", indent, "", (uintmax_t) offset, op_name, (uintmax_t) addr); offset += 1 + ref_size;