summaryrefslogtreecommitdiffstats
path: root/src/readelf.c
diff options
context:
space:
mode:
authorMark Wielaard <[email protected]>2013-03-25 21:11:53 +0100
committerMark Wielaard <[email protected]>2013-03-26 09:16:23 +0100
commita8c7f05cfd03a58821c3da68f3f577c882258674 (patch)
tree9ea05ec929884329bb38915347384b09749a56c8 /src/readelf.c
parenta1d44825ffc756ed6c0dca3a836c1ff9f0ec151f (diff)
readelf: When highpc is in constant form also print as address.
When highpc is in constant form it is relative to lowpc. In that case also show as address. Suggested-by: Jan Kratochvil <[email protected]> Signed-off-by: Mark Wielaard <[email protected]>
Diffstat (limited to 'src/readelf.c')
-rw-r--r--src/readelf.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/src/readelf.c b/src/readelf.c
index 1412bed3..6d9db73f 100644
--- a/src/readelf.c
+++ b/src/readelf.c
@@ -5242,6 +5242,7 @@ struct attrcb_args
{
Dwfl_Module *dwflmod;
Dwarf *dbg;
+ Dwarf_Die *die;
int level;
bool silent;
unsigned int version;
@@ -5437,7 +5438,19 @@ attr_callback (Dwarf_Attribute *attrp, void *arg)
if (cbargs->silent)
break;
- if (valuestr == NULL)
+ /* When highpc is in constant form it is relative to lowpc.
+ In that case also show the address. */
+ Dwarf_Addr highpc;
+ if (attr == DW_AT_high_pc && dwarf_highpc (cbargs->die, &highpc) == 0)
+ {
+ char *a = format_dwarf_addr (cbargs->dwflmod, cbargs->addrsize,
+ highpc, highpc);
+ printf (" %*s%-20s (%s) %" PRIuMAX " (%s)\n",
+ (int) (level * 2), "", dwarf_attr_name (attr),
+ 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);
@@ -5659,6 +5672,7 @@ print_debug_units (Dwfl_Module *dwflmod,
/* Print the attribute values. */
args.level = level;
+ args.die = &dies[level];
(void) dwarf_getattrs (&dies[level], attr_callback, &args, 0);
/* Make room for the next level's DIE. */