Patch from Jim Wilson - more bug fixes for line table decoding.
authorNick Clifton <nickc@redhat.com>
Fri, 27 Aug 1999 10:34:58 +0000 (10:34 +0000)
committerNick Clifton <nickc@redhat.com>
Fri, 27 Aug 1999 10:34:58 +0000 (10:34 +0000)
binutils/ChangeLog
binutils/readelf.c

index cbfae904f33f7e8c119cb19a884d540675bd6d6b..d863c73f2a8e382dae0eb52528a13fa6e974b871 100644 (file)
@@ -1,3 +1,10 @@
+1999-08-27  Jim Wilson  <wilson@cygnus.com>
+
+       * readelf.c (display_debug_lines): Use i-1 not i in standard_opcodes
+       access.
+       (display_debug_aranges): New local excess.  Use for calculating padding
+       and add that into ranges.  Break from loop only if length is also 0.
+
 1999-08-27  Jim Wilson  <wilson@cygnus.com>
 
        * readelf.c (display_debug_lines, case DW_LNS_const_add_pc): Multiply
index c785a491eb4877f78c41d9a211353c3a71171c99..00c71a3caab938c1bc39d422ca6d0a011111e58b 100644 (file)
@@ -4262,7 +4262,7 @@ display_debug_lines (section, start, file)
       printf (_("\n Opcodes:\n"));
       
       for (i = 1; i < info.li_opcode_base; i++)
-       printf (_("  Opcode %d has %d args\n"), i, standard_opcodes[i]);
+       printf (_("  Opcode %d has %d args\n"), i, standard_opcodes[i - 1]);
       
       /* Display the contents of the Directory table.  */
       data = standard_opcodes + info.li_opcode_base - 1;
@@ -5754,6 +5754,7 @@ display_debug_aranges (section, start, file)
       unsigned char *          ranges;
       unsigned long            length;
       unsigned long            address;
+      int                     excess;
 
       external = (DWARF2_External_ARange *) start;
 
@@ -5773,19 +5774,25 @@ display_debug_aranges (section, start, file)
 
       ranges = start + sizeof (* external);
 
+      /* Must pad to an alignment boundary that is twice the pointer size.  */
+      excess = sizeof (*external) % (2 * arange.ar_pointer_size);
+      if (excess)
+       ranges += (2 * arange.ar_pointer_size) - excess;
+
       for (;;)
        {
          address = byte_get (ranges, arange.ar_pointer_size);
 
-         if (address == 0)
-           break;
-
          ranges += arange.ar_pointer_size;
 
          length  = byte_get (ranges, arange.ar_pointer_size);
 
          ranges += arange.ar_pointer_size;
 
+         /* A pair of zeros marks the end of the list.  */
+         if (address == 0 && length == 0)
+           break;
+         
          printf ("    %8.8lx %lu\n", address, length);
        }