summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorUlrich Drepper <[email protected]>2009-01-24 17:01:08 -0800
committerUlrich Drepper <[email protected]>2009-01-24 17:01:08 -0800
commit62c465323070bd837df170fc8a6bc02b8e31799b (patch)
tree4ccb81f42132af7cfd9d0c796680c186a69a752e
parentccccab08d66be13fe9ff5ca07f46709c069b45a2 (diff)
Fix compuation of base address for printing stack frame program.
-rw-r--r--src/ChangeLog5
-rw-r--r--src/readelf.c32
2 files changed, 23 insertions, 14 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index 6203f712..4886bcf2 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,8 @@
+2009-01-24 Ulrich Drepper <[email protected]>
+
+ * readelf.c (print_debug_frame_section): Fix computation of vma_base
+ for PC-relative mode.
+
2009-01-23 Ulrich Drepper <[email protected]>
* size.c (process_file): When handling archive, close file descriptor
diff --git a/src/readelf.c b/src/readelf.c
index 88eb9a7c..55c906f7 100644
--- a/src/readelf.c
+++ b/src/readelf.c
@@ -4643,6 +4643,7 @@ print_debug_frame_section (Dwfl_Module *dwflmod, Ebl *ebl, GElf_Ehdr *ehdr,
unsigned int fde_encoding = 0;
unsigned int lsda_encoding = 0;
Dwarf_Word initial_location = 0;
+ Dwarf_Word vma_base = 0;
if (cie_id == (is_eh_frame ? 0 : DW_CIE_ID))
{
@@ -4809,16 +4810,26 @@ print_debug_frame_section (Dwfl_Module *dwflmod, Ebl *ebl, GElf_Ehdr *ehdr,
cie->cie_offset, (uint64_t) cie_id,
(uint64_t) initial_location);
if ((fde_encoding & 0x70) == DW_EH_PE_pcrel)
- printf (gettext (" (offset: %#" PRIx64 ")"),
- ((uint64_t) shdr->sh_offset
- + (base - (const unsigned char *) data->d_buf)
- + (uint64_t) initial_location)
+ {
+ vma_base = (((uint64_t) shdr->sh_offset
+ + (base - (const unsigned char *) data->d_buf)
+ + (uint64_t) initial_location)
+ & (ptr_size == 4
+ ? UINT64_C (0xffffffff)
+ : UINT64_C (0xffffffffffffffff)));
+ printf (gettext (" (offset: %#" PRIx64 ")"),
+ (uint64_t) vma_base);
+ }
+
+ printf ("\n address_range: %#" PRIx64,
+ (uint64_t) address_range);
+ if ((fde_encoding & 0x70) == DW_EH_PE_pcrel)
+ printf (gettext (" (end offset: %#" PRIx64 ")"),
+ ((uint64_t) vma_base + (uint64_t) address_range)
& (ptr_size == 4
? UINT64_C (0xffffffff)
: UINT64_C (0xffffffffffffffff)));
-
- printf ("\n address_range: %#" PRIx64 "\n",
- (uint64_t) address_range);
+ putchar ('\n');
if (cie->augmentation[0] == 'z')
{
@@ -4859,13 +4870,6 @@ print_debug_frame_section (Dwfl_Module *dwflmod, Ebl *ebl, GElf_Ehdr *ehdr,
}
}
- /* To print correct addresses compute the base address. */
- Dwarf_Word vma_base;
- if ((fde_encoding & 0x70) == DW_EH_PE_pcrel && ehdr->e_type != ET_REL)
- vma_base = shdr->sh_addr + initial_location;
- else
- vma_base = 0;
-
/* Handle the initialization instructions. */
print_cfa_program (readp, cieend, vma_base, code_alignment_factor,
data_alignment_factor, ptr_size, dwflmod, ebl, dbg);