summaryrefslogtreecommitdiffstats
path: root/src/readelf.c
diff options
context:
space:
mode:
authorRoland McGrath <[email protected]>2010-05-08 04:01:14 -0700
committerRoland McGrath <[email protected]>2010-08-30 04:10:41 -0700
commit932585d2385c9d4e5686e4ddc9ba30c68172d7f3 (patch)
treed9a9bd294301b8d01c7a994b9560cb68121dcd3f /src/readelf.c
parenta159915a87d83951acb9e504b9cefc08ba98b8bd (diff)
Handle DW_OP_GNU_implicit_pointer.
Diffstat (limited to 'src/readelf.c')
-rw-r--r--src/readelf.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/src/readelf.c b/src/readelf.c
index fd9f9a5d..8c5e8151 100644
--- a/src/readelf.c
+++ b/src/readelf.c
@@ -3969,6 +3969,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest,
[DW_OP_bit_piece] = "bit_piece",
[DW_OP_implicit_value] = "implicit_value",
[DW_OP_stack_value] = "stack_value",
+ [DW_OP_GNU_implicit_pointer] = "GNU_implicit_pointer",
};
if (len == 0)
@@ -4211,6 +4212,28 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest,
offset += 1 + (data - start);
break;
+ case DW_OP_GNU_implicit_pointer:
+ /* DIE offset operand. */
+ start = data;
+ NEED (ref_size + 1);
+ if (ref_size == 4)
+ addr = read_4ubyte_unaligned (dbg, data);
+ else
+ {
+ assert (ref_size == 8);
+ addr = read_8ubyte_unaligned (dbg, data);
+ }
+ data += ref_size;
+ /* Byte offset operand. */
+ get_sleb128 (sleb, data); /* XXX check overrun */
+
+ printf ("%*s[%4" PRIuMAX "] %s %#" PRIxMAX ", %+" PRId64 "\n",
+ indent, "", (intmax_t) offset,
+ known[op], (uintmax_t) addr, sleb);
+ CONSUME (data - start);
+ offset += 1 + (data - start);
+ break;
+
default:
/* No Operand. */
if (op < sizeof known / sizeof known[0] && known[op] != NULL)