diff -Nru elfutils-0.185.orig/backends/x86_64_init.c elfutils-0.185/backends/x86_64_init.c --- elfutils-0.185.orig/backends/x86_64_init.c 2021-05-22 11:25:24.000000000 -0700 +++ elfutils-0.185/backends/x86_64_init.c 2021-10-03 22:11:47.050651661 -0700 @@ -60,7 +60,7 @@ HOOK (eh, disasm); HOOK (eh, abi_cfi); /* gcc/config/ #define DWARF_FRAME_REGISTERS. */ - eh->frame_nregs = 17; + eh->frame_nregs = 67; HOOK (eh, set_initial_registers_tid); HOOK (eh, unwind); HOOK (eh, check_reloc_target_type); diff -Nru elfutils-0.185.orig/backends/x86_64_initreg.c elfutils-0.185/backends/x86_64_initreg.c --- elfutils-0.185.orig/backends/x86_64_initreg.c 2021-05-22 11:25:24.000000000 -0700 +++ elfutils-0.185/backends/x86_64_initreg.c 2021-10-03 21:52:42.251129764 -0700 @@ -68,6 +68,21 @@ dwarf_regs[14] = user_regs.r14; dwarf_regs[15] = user_regs.r15; dwarf_regs[16] = user_regs.rip; - return setfunc (0, 17, dwarf_regs, arg); + if (!setfunc (0, 17, dwarf_regs, arg)) + return false; + dwarf_regs[0] = user_regs.eflags; + dwarf_regs[1] = user_regs.es; + dwarf_regs[2] = user_regs.cs; + dwarf_regs[3] = user_regs.ss; + dwarf_regs[4] = user_regs.ds; + dwarf_regs[5] = user_regs.fs; + dwarf_regs[6] = user_regs.gs; + if (!setfunc (49, 7, dwarf_regs, arg)) + return false; + dwarf_regs[0] = user_regs.fs_base; + dwarf_regs[1] = user_regs.gs_base; + if (!setfunc (58, 2, dwarf_regs, arg)) + return false; + return true; #endif /* __x86_64__ */ } diff -Nru elfutils-0.185.orig/libasm/disasm_str.c elfutils-0.185/libasm/disasm_str.c --- elfutils-0.185.orig/libasm/disasm_str.c 2021-05-22 11:25:24.000000000 -0700 +++ elfutils-0.185/libasm/disasm_str.c 2021-10-10 12:11:45.840383058 -0700 @@ -52,7 +52,7 @@ return len - buffer->len; buffer->buf = mempcpy (buffer->buf, str, len); - buffer->len = len; + buffer->len -= len; return 0; } diff -Nru elfutils-0.185.orig/libdw/libdw.map elfutils-0.185/libdw/libdw.map --- elfutils-0.185.orig/libdw/libdw.map 2021-05-22 11:25:24.000000000 -0700 +++ elfutils-0.185/libdw/libdw.map 2021-10-18 22:46:59.033075060 -0700 @@ -360,3 +360,11 @@ # presume that NULL is only returned on error (otherwise ELF_K_NONE). dwelf_elf_begin; } ELFUTILS_0.175; + +ELFUTILS_0.185 { + global: + __libdwfl_frame_reg_get; + __libdwfl_frame_reg_set; + dwfl_module_getebl; + __libdwfl_expr_eval; +} ELFUTILS_0.177; diff -Nru elfutils-0.185.orig/libdwfl/dwfl_module_getdwarf.c elfutils-0.185/libdwfl/dwfl_module_getdwarf.c --- elfutils-0.185.orig/libdwfl/dwfl_module_getdwarf.c 2021-05-22 11:25:24.000000000 -0700 +++ elfutils-0.185/libdwfl/dwfl_module_getdwarf.c 2021-10-10 10:52:06.204694821 -0700 @@ -1296,6 +1296,12 @@ } } +void * +dwfl_module_getebl (Dwfl_Module *mod) +{ + __libdwfl_module_getebl (mod); + return mod->ebl; +} /* Try to open a libebl backend for MOD. */ Dwfl_Error diff -Nru elfutils-0.185.orig/libdwfl/frame_unwind.c elfutils-0.185/libdwfl/frame_unwind.c --- elfutils-0.185.orig/libdwfl/frame_unwind.c 2021-05-22 11:25:24.000000000 -0700 +++ elfutils-0.185/libdwfl/frame_unwind.c 2021-10-18 22:43:50.357209634 -0700 @@ -44,7 +44,6 @@ #define DWARF_EXPR_STEPS_MAX 0x1000 bool -internal_function __libdwfl_frame_reg_get (Dwfl_Frame *state, unsigned regno, Dwarf_Addr *val) { Ebl *ebl = state->thread->process->ebl; @@ -61,7 +60,6 @@ } bool -internal_function __libdwfl_frame_reg_set (Dwfl_Frame *state, unsigned regno, Dwarf_Addr val) { Ebl *ebl = state->thread->process->ebl; @@ -507,6 +505,13 @@ #undef pop } +bool +__libdwfl_expr_eval (Dwfl_Frame *state, Dwarf_Frame *frame, const Dwarf_Op *ops, + size_t nops, Dwarf_Addr *result, Dwarf_Addr bias) +{ + return expr_eval(state, frame, ops, nops, result, bias); +} + static Dwfl_Frame * new_unwound (Dwfl_Frame *state) { diff -Nru elfutils-0.185.orig/libdwfl/libdwfl.h elfutils-0.185/libdwfl/libdwfl.h --- elfutils-0.185.orig/libdwfl/libdwfl.h 2021-05-22 11:25:24.000000000 -0700 +++ elfutils-0.185/libdwfl/libdwfl.h 2021-10-18 22:45:23.065138899 -0700 @@ -795,6 +795,23 @@ bool dwfl_frame_pc (Dwfl_Frame *state, Dwarf_Addr *pc, bool *isactivation) __nonnull_attribute__ (1, 2); +/* Fetch value from Dwfl_Frame->regs indexed by DWARF REGNO. + No error code is set if the function returns FALSE. */ +bool __libdwfl_frame_reg_get (Dwfl_Frame *state, unsigned regno, + Dwarf_Addr *val); + +/* Store value to Dwfl_Frame->regs indexed by DWARF REGNO. + No error code is set if the function returns FALSE. */ +bool __libdwfl_frame_reg_set (Dwfl_Frame *state, unsigned regno, + Dwarf_Addr val); + +void *dwfl_module_getebl (Dwfl_Module *mod); + +#ifdef _LIBDW_H +bool __libdwfl_expr_eval (Dwfl_Frame *state, Dwarf_Frame *frame, + const Dwarf_Op *ops, size_t nops, Dwarf_Addr *result, Dwarf_Addr bias); +#endif + #ifdef __cplusplus } #endif diff -Nru elfutils-0.185.orig/libdwfl/libdwflP.h elfutils-0.185/libdwfl/libdwflP.h --- elfutils-0.185.orig/libdwfl/libdwflP.h 2021-05-22 11:25:24.000000000 -0700 +++ elfutils-0.185/libdwfl/libdwflP.h 2021-10-03 09:53:38.887119596 -0700 @@ -276,18 +276,6 @@ Dwarf_Addr regs[]; }; -/* Fetch value from Dwfl_Frame->regs indexed by DWARF REGNO. - No error code is set if the function returns FALSE. */ -bool __libdwfl_frame_reg_get (Dwfl_Frame *state, unsigned regno, - Dwarf_Addr *val) - internal_function; - -/* Store value to Dwfl_Frame->regs indexed by DWARF REGNO. - No error code is set if the function returns FALSE. */ -bool __libdwfl_frame_reg_set (Dwfl_Frame *state, unsigned regno, - Dwarf_Addr val) - internal_function; - /* Information cached about each CU in Dwfl_Module.dw. */ struct dwfl_cu {