diff options
| author | Mark Wielaard <[email protected]> | 2013-03-25 21:11:53 +0100 |
|---|---|---|
| committer | Mark Wielaard <[email protected]> | 2013-03-26 09:16:23 +0100 |
| commit | a8c7f05cfd03a58821c3da68f3f577c882258674 (patch) | |
| tree | 9ea05ec929884329bb38915347384b09749a56c8 | |
| parent | a1d44825ffc756ed6c0dca3a836c1ff9f0ec151f (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]>
| -rw-r--r-- | src/ChangeLog | 7 | ||||
| -rw-r--r-- | src/readelf.c | 16 | ||||
| -rw-r--r-- | tests/ChangeLog | 4 | ||||
| -rwxr-xr-x | tests/run-readelf-dwz-multi.sh | 12 |
4 files changed, 32 insertions, 7 deletions
diff --git a/src/ChangeLog b/src/ChangeLog index a641d333..24bc6bfa 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,10 @@ +2013-03-25 Mark Wielaard <[email protected]> + + * readelf.c (attrcb_args): Add Dwarf_Die. + (attr_callback): When highpc is in constant form also print as + address. + (print_debug_units): Set args.die. + 2013-03-19 Mark Wielaard <[email protected]> * readelf.c (print_gdb_index_section): Free format_dwarf_addr results. 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. */ diff --git a/tests/ChangeLog b/tests/ChangeLog index 62b589dc..34657773 100644 --- a/tests/ChangeLog +++ b/tests/ChangeLog @@ -1,3 +1,7 @@ +2013-03-25 Mark Wielaard <[email protected]> + + * run-readelf-dwz-multi.sh: Expect high_pc also as address. + 2013-03-20 Jan Kratochvil <[email protected]> * Makefile.am (check_PROGRAMS): Add dwfl-report-elf-align. diff --git a/tests/run-readelf-dwz-multi.sh b/tests/run-readelf-dwz-multi.sh index 20c00c5f..ca939f30 100755 --- a/tests/run-readelf-dwz-multi.sh +++ b/tests/run-readelf-dwz-multi.sh @@ -90,7 +90,7 @@ DWARF section [28] '.debug_info' at offset 0x1078: name (strp) "main.c" comp_dir (GNU_strp_alt) "/home/mark/src/tests/dwz" low_pc (addr) 0x00000000004006ac <main> - high_pc (udata) 44 + high_pc (udata) 44 (0x00000000004006d8) stmt_list (sec_offset) 0 [ 26] imported_unit import (GNU_ref_alt) [ b] @@ -105,7 +105,7 @@ DWARF section [28] '.debug_info' at offset 0x1078: prototyped (flag_present) type (GNU_ref_alt) [ 3e] low_pc (addr) 0x00000000004006ac <main> - high_pc (udata) 44 + high_pc (udata) 44 (0x00000000004006d8) frame_base (exprloc) [ 0] call_frame_cfa GNU_all_tail_call_sites (flag_present) @@ -148,7 +148,7 @@ DWARF section [25] '.debug_info' at offset 0x106c: name (strp) "shared.c" comp_dir (GNU_strp_alt) "/home/mark/src/tests/dwz" low_pc (addr) +0x0000000000000670 <call_foo> - high_pc (udata) 23 + high_pc (udata) 23 (+0x0000000000000687) stmt_list (sec_offset) 0 [ 26] imported_unit import (GNU_ref_alt) [ b] @@ -160,7 +160,7 @@ DWARF section [25] '.debug_info' at offset 0x106c: prototyped (flag_present) type (GNU_ref_alt) [ 3e] low_pc (addr) +0x0000000000000670 <call_foo> - high_pc (udata) 23 + high_pc (udata) 23 (+0x0000000000000687) frame_base (exprloc) [ 0] call_frame_cfa GNU_all_call_sites (flag_present) @@ -185,7 +185,7 @@ DWARF section [28] '.debug_info' at offset 0x1088: name (GNU_strp_alt) "main.c" comp_dir (GNU_strp_alt) "/home/mark/src/tests" low_pc (addr) 0x00000000004004ec <main> - high_pc (udata) 18 + high_pc (udata) 18 (0x00000000004004fe) stmt_list (sec_offset) 0 [ 26] imported_unit import (GNU_ref_alt) [ b] @@ -197,7 +197,7 @@ DWARF section [28] '.debug_info' at offset 0x1088: prototyped (flag_present) type (GNU_ref_alt) [ 30] low_pc (addr) 0x00000000004004ec <main> - high_pc (udata) 18 + high_pc (udata) 18 (0x00000000004004fe) frame_base (exprloc) [ 0] call_frame_cfa GNU_all_call_sites (flag_present) |
