]> git.ipfire.org Git - thirdparty/elfutils.git/commitdiff
readelf: Print DW_FORM_sdata values as signed numbers.
authorMark Wielaard <mjw@redhat.com>
Wed, 5 Mar 2014 15:17:54 +0000 (16:17 +0100)
committerMark Wielaard <mjw@redhat.com>
Mon, 10 Mar 2014 15:15:45 +0000 (16:15 +0100)
Printing DW_FORM_sdata numbers as unsigned values is misleading.

Signed-off-by: Mark Wielaard <mjw@redhat.com>
src/ChangeLog
src/readelf.c

index 80be466a2e638e5f6ba075f65844f7bea4ea8e13..c16626710ceec4592f673150c6f664c46f6ac8b4 100644 (file)
@@ -1,3 +1,8 @@
+2014-03-05  Mark Wielaard  <mjw@redhat.com>
+
+       * readelf.c (attr_callback): Print DW_FORM_sdata values as signed
+       numbers.
+
 2014-02-24  Mark Wielaard  <mjw@redhat.com>
 
        * readelf (print_phdr): Check there is a SHT_PROGBITS section at the
index 63675c6022dedd4af5f72225e8a8a038f68fabec..d2efbaebb7b935df0b8b9440d9492bca208d33b6 100644 (file)
@@ -5732,14 +5732,34 @@ attr_callback (Dwarf_Attribute *attrp, void *arg)
                  dwarf_form_name (form), (uintmax_t) num, a);
          free (a);
        }
-      else if (valuestr == NULL)
-       printf ("           %*s%-20s (%s) %" PRIuMAX "\n",
-               (int) (level * 2), "", dwarf_attr_name (attr),
-               dwarf_form_name (form), (uintmax_t) num);
       else
-       printf ("           %*s%-20s (%s) %s (%" PRIuMAX ")\n",
-               (int) (level * 2), "", dwarf_attr_name (attr),
-               dwarf_form_name (form), valuestr, (uintmax_t) num);
+       {
+         Dwarf_Sword snum = 0;
+         if (form == DW_FORM_sdata)
+           if (unlikely (dwarf_formsdata (attrp, &snum) != 0))
+             goto attrval_out;
+
+         if (valuestr == NULL)
+           {
+             printf ("           %*s%-20s (%s)",
+                     (int) (level * 2), "", dwarf_attr_name (attr),
+                     dwarf_form_name (form));
+             if (form == DW_FORM_sdata)
+               printf (" %" PRIdMAX "\n", (intmax_t) snum);
+             else
+               printf (" %" PRIuMAX "\n", (uintmax_t) num);
+           }
+         else
+           {
+             printf ("           %*s%-20s (%s) %s",
+                     (int) (level * 2), "", dwarf_attr_name (attr),
+                     dwarf_form_name (form), valuestr);
+             if (form == DW_FORM_sdata)
+               printf (" (%" PRIdMAX ")\n", (intmax_t) snum);
+             else
+               printf (" (%" PRIuMAX ")\n", (uintmax_t) num);
+           }
+       }
       break;
 
     case DW_FORM_flag: