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 | |
| 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')
| -rw-r--r-- | src/ChangeLog | 5 | ||||
| -rw-r--r-- | src/readelf.c | 34 |
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: |
