summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ChangeLog5
-rw-r--r--src/readelf.c34
2 files changed, 32 insertions, 7 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index 80be466a..c1662671 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,8 @@
+2014-03-05 Mark Wielaard <[email protected]>
+
+ * readelf.c (attr_callback): Print DW_FORM_sdata values as signed
+ numbers.
+
2014-02-24 Mark Wielaard <[email protected]>
* readelf (print_phdr): Check there is a SHT_PROGBITS section at the
diff --git a/src/readelf.c b/src/readelf.c
index 63675c60..d2efbaeb 100644
--- a/src/readelf.c
+++ b/src/readelf.c
@@ -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: