Don't print raw block contents for locations we decode and print.
authorRoland McGrath <roland@redhat.com>
Fri, 21 Aug 2009 10:16:32 +0000 (03:16 -0700)
committerRoland McGrath <roland@redhat.com>
Fri, 21 Aug 2009 10:16:32 +0000 (03:16 -0700)
src/ChangeLog
src/readelf.c

index c0ea003..7b9970c 100644 (file)
@@ -1,3 +1,8 @@
+2009-08-21  Roland McGrath  <roland@redhat.com>
+
+       * readelf.c (attr_callback): Use print_block only when we don't use
+       print_ops.
+
 2009-08-14  Roland McGrath  <roland@redhat.com>
 
        * ar.c (do_oper_extract): Use pathconf instead of statfs.
index b0f8fb0..e5b67b2 100644 (file)
@@ -3065,12 +3065,14 @@ print_attributes (Ebl *ebl, const GElf_Ehdr *ehdr)
 
 static char *
 format_dwarf_addr (Dwfl_Module *dwflmod,
-                  int address_size, Dwarf_Addr address)
+                  int address_size, Dwarf_Addr address, bool tls)
 {
   /* See if there is a name we can give for this address.  */
   GElf_Sym sym;
   const char *name = print_address_names
-    ? dwfl_module_addrsym (dwflmod, address, &sym, NULL) : NULL;
+    ? ((tls ? dwfl_module_addrsym_tls : dwfl_module_addrsym)
+       (dwflmod, address, &sym, NULL))
+    : NULL;
   if (name != NULL)
     sym.st_value = address - sym.st_value;
 
@@ -3932,7 +3934,10 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest,
 
          if (op == DW_OP_addr)
            {
-             char *a = format_dwarf_addr (dwflmod, 0, addr);
+             char *a = format_dwarf_addr
+               (dwflmod, 0, addr,
+                len > 0 && (*data == DW_OP_GNU_push_tls_address
+                            || *data == DW_OP_form_tls_address));
              printf ("%*s[%4" PRIuMAX "] %s %s\n",
                      indent, "", (uintmax_t) offset, known[op], a);
              free (a);
@@ -4322,7 +4327,7 @@ print_debug_ranges_section (Dwfl_Module *dwflmod,
 
       if (begin == (Dwarf_Addr) -1l) /* Base address entry.  */
        {
-         char *b = format_dwarf_addr (dwflmod, address_size, end);
+         char *b = format_dwarf_addr (dwflmod, address_size, end, false);
          printf (gettext (" [%6tx]  base address %s\n"), offset, b);
          free (b);
        }
@@ -4330,8 +4335,8 @@ print_debug_ranges_section (Dwfl_Module *dwflmod,
        first = true;
       else
        {
-         char *b = format_dwarf_addr (dwflmod, address_size, begin);
-         char *e = format_dwarf_addr (dwflmod, address_size, end);
+         char *b = format_dwarf_addr (dwflmod, address_size, begin, false);
+         char *e = format_dwarf_addr (dwflmod, address_size, end, false);
          /* We have an address range entry.  */
          if (first)            /* First address range entry in a list.  */
            printf (gettext (" [%6tx]  %s..%s\n"), offset, b, e);
@@ -5120,7 +5125,8 @@ attr_callback (Dwarf_Attribute *attrp, void *arg)
                   dwarf_errmsg (-1));
            return DWARF_CB_ABORT;
          }
-       char *a = format_dwarf_addr (cbargs->dwflmod, cbargs->addrsize, addr);
+       char *a = format_dwarf_addr (cbargs->dwflmod, cbargs->addrsize,
+                                    addr, false);
        printf ("           %*s%-20s %s\n",
                (int) (level * 2), "", dwarf_attr_string (attr), a);
        free (a);
@@ -5261,7 +5267,6 @@ attr_callback (Dwarf_Attribute *attrp, void *arg)
 
       printf ("           %*s%-20s ",
              (int) (level * 2), "", dwarf_attr_string (attr));
-      print_block (block.length, block.data);
 
       switch (attr)
        {
@@ -5288,6 +5293,10 @@ attr_callback (Dwarf_Attribute *attrp, void *arg)
                     12 + level * 2, 12 + level * 2,
                     cbargs->addrsize, block.length, block.data);
          break;
+
+       default:
+         print_block (block.length, block.data);
+         break;
        }
       break;
 
@@ -5654,7 +5663,7 @@ print_debug_line_section (Dwfl_Module *dwflmod, Ebl *ebl,
              line += line_increment;
              address += address_increment;
 
-             char *a = format_dwarf_addr (dwflmod, 0, address);
+             char *a = format_dwarf_addr (dwflmod, 0, address, false);
              printf (gettext ("\
  special opcode %u: address+%u = %s, line%+d = %zu\n"),
                      opcode, address_increment, a, line_increment, line);
@@ -5694,7 +5703,7 @@ print_debug_line_section (Dwfl_Module *dwflmod, Ebl *ebl,
                  else
                    address = read_8ubyte_unaligned_inc (dbg, linep);
                  {
-                   char *a = format_dwarf_addr (dwflmod, 0, address);
+                   char *a = format_dwarf_addr (dwflmod, 0, address, false);
                    printf (gettext ("set address to %s\n"), a);
                    free (a);
                  }
@@ -5746,7 +5755,7 @@ define new file: dir=%u, mtime=%" PRIu64 ", length=%" PRIu64 ", name=%s\n"),
                  get_uleb128 (u128, linep);
                  address += minimum_instr_len * u128;
                  {
-                   char *a = format_dwarf_addr (dwflmod, 0, address);
+                   char *a = format_dwarf_addr (dwflmod, 0, address, false);
                    printf (gettext ("advance address by %u to %s\n"),
                            u128, a);
                    free (a);
@@ -5798,7 +5807,7 @@ define new file: dir=%u, mtime=%" PRIu64 ", length=%" PRIu64 ", name=%s\n"),
                          * ((255 - opcode_base) / line_range));
                  address += u128;
                  {
-                   char *a = format_dwarf_addr (dwflmod, 0, address);
+                   char *a = format_dwarf_addr (dwflmod, 0, address, false);
                    printf (gettext ("advance address by constant %u to %s\n"),
                            u128, a);
                    free (a);
@@ -5814,7 +5823,7 @@ define new file: dir=%u, mtime=%" PRIu64 ", length=%" PRIu64 ", name=%s\n"),
                  u128 = read_2ubyte_unaligned_inc (dbg, linep);
                  address += u128;
                  {
-                   char *a = format_dwarf_addr (dwflmod, 0, address);
+                   char *a = format_dwarf_addr (dwflmod, 0, address, false);
                    printf (gettext ("\
 advance address by fixed value %u to %s\n"),
                            u128, a);
@@ -5910,7 +5919,7 @@ print_debug_loc_section (Dwfl_Module *dwflmod,
 
       if (begin == (Dwarf_Addr) -1l) /* Base address entry.  */
        {
-         char *b = format_dwarf_addr (dwflmod, address_size, end);
+         char *b = format_dwarf_addr (dwflmod, address_size, end, false);
          printf (gettext (" [%6tx]  base address %s\n"), offset, b);
          free (b);
        }
@@ -5921,8 +5930,8 @@ print_debug_loc_section (Dwfl_Module *dwflmod,
          /* We have a location expression entry.  */
          uint_fast16_t len = read_2ubyte_unaligned_inc (dbg, readp);
 
-         char *b = format_dwarf_addr (dwflmod, address_size, begin);
-         char *e = format_dwarf_addr (dwflmod, address_size, end);
+         char *b = format_dwarf_addr (dwflmod, address_size, begin, false);
+         char *e = format_dwarf_addr (dwflmod, address_size, end, false);
 
          if (first)            /* First entry in a list.  */
            printf (gettext (" [%6tx]  %s..%s"), offset, b, e);