diff options
| author | Mark Wielaard <[email protected]> | 2014-03-05 16:17:54 +0100 |
|---|---|---|
| committer | Mark Wielaard <[email protected]> | 2014-03-10 16:15:45 +0100 |
| commit | b92075265572739b04ed1027a6764ff65750b108 (patch) | |
| tree | 0d25c1856a0bb89d378bfe9fec180fb8eee7b4d1 /src/readelf.c | |
| parent | dff2a99d84a756792f65d31fa19becce792f2ca5 (diff) | |
readelf: Print DW_FORM_sdata values as signed numbers.
Printing DW_FORM_sdata numbers as unsigned values is misleading.
Signed-off-by: Mark Wielaard <[email protected]>
Diffstat (limited to 'src/readelf.c')
| -rw-r--r-- | src/readelf.c | 34 |
1 files changed, 27 insertions, 7 deletions
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: |
