The cached reads lack the big endian adjustments done in the fallback path.
Signed-off-by: Andreas Krebbel <kreb...@linux.ibm.com> --- libdwfl/ChangeLog | 5 +++++ libdwfl/linux-pid-attach.c | 10 +++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/libdwfl/ChangeLog b/libdwfl/ChangeLog index 59ef37aa..ecd87d3a 100644 --- a/libdwfl/ChangeLog +++ b/libdwfl/ChangeLog @@ -1,3 +1,8 @@ +2020-11-19 Andreas Krebbel <kreb...@linux.ibm.com> + + * linux-pid-attach.c (pid_memory_read): Shift the upper 4 bytes + down on big endian 64 bit targets. + 2020-11-12 Timm Bäder <tbae...@redhat.com> * dwfl_segment_report_module.c (dwfl_segment_report_module): Remove diff --git a/libdwfl/linux-pid-attach.c b/libdwfl/linux-pid-attach.c index 3a6af997..b23139d9 100644 --- a/libdwfl/linux-pid-attach.c +++ b/libdwfl/linux-pid-attach.c @@ -193,14 +193,22 @@ pid_memory_read (Dwfl *dwfl, Dwarf_Addr addr, Dwarf_Word *result, void *arg) { struct __libdwfl_pid_arg *pid_arg = arg; pid_t tid = pid_arg->tid_attached; + Dwfl_Process *process = dwfl->process; assert (tid > 0); #ifdef HAVE_PROCESS_VM_READV if (read_cached_memory (pid_arg, addr, result)) + { +#if SIZEOF_LONG == 8 +# if BYTE_ORDER == BIG_ENDIAN + if (ebl_get_elfclass (process->ebl) == ELFCLASS32) + *result >>= 32; +# endif +#endif return true; + } #endif - Dwfl_Process *process = dwfl->process; if (ebl_get_elfclass (process->ebl) == ELFCLASS64) { #if SIZEOF_LONG == 8 -- 2.25.1