+2005-08-10 James E. Wilson <wilson@specifix.com>
+
+ * dwarf2.c (scan_unit_for_symbols, case DT_AT_location): Verify that
+ DW_OP_addr is only opcode in location before using it.
+
2005-08-09 H.J. Lu <hongjiu.lu@intel.com>
* elfxx-ia64.c (elfNN_ia64_final_link): Reset gp.
if (*attr.u.blk->data == DW_OP_addr)
{
var->stack = 0;
- var->addr = bfd_get ((attr.u.blk->size - 1) * 8,
- unit->abfd,
- attr.u.blk->data + 1);
+
+ /* Verify that DW_OP_addr is the only opcode in the
+ location, in which case the block size will be 1
+ plus the address size. */
+ /* ??? For TLS variables, gcc can emit
+ DW_OP_addr <addr> DW_OP_GNU_push_tls_address
+ which we don't handle here yet. */
+ if (attr.u.blk->size == unit->addr_size + 1U)
+ var->addr = bfd_get (unit->addr_size * 8,
+ unit->abfd,
+ attr.u.blk->data + 1);
}
break;