Fix linker error found when compiling glibc with a mismatched gcc.
authorJim Wilson <wilson@tuliptree.org>
Wed, 10 Aug 2005 23:33:39 +0000 (23:33 +0000)
committerJim Wilson <wilson@tuliptree.org>
Wed, 10 Aug 2005 23:33:39 +0000 (23:33 +0000)
* dwarf2.c (scan_unit_for_symbols, case DT_AT_location): Verify that
DW_OP_addr is only opcode in location before using it.

bfd/ChangeLog
bfd/dwarf2.c

index 97c62c74ea2650b662b5ac55f5dd1cdd45596ffe..a7a7608d5add1e1eb4914cf4e79afe6cda31c94c 100644 (file)
@@ -1,3 +1,8 @@
+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.
index 2635a5739ef9f18fbb7e4b5c15037bc71df9da02..1348137355e984a358735b152385b166f271392c 100644 (file)
@@ -1782,9 +1782,17 @@ scan_unit_for_symbols (struct comp_unit *unit)
                      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;