From c9fe729ce0baa4ce56235d978e19c8ef68a14a37 Mon Sep 17 00:00:00 2001 From: frmdstryr Date: Thu, 27 Jul 2023 13:40:22 -0400 Subject: [PATCH] Make rz_core_analysis_var_display work with stack vars when debugging (#3687) --- librz/analysis/var.c | 13 ------------- librz/core/canalysis.c | 22 +++++++++++++++++++++- librz/core/cmd/cmd_type.c | 2 +- librz/include/rz_analysis.h | 1 - librz/include/rz_core.h | 2 ++ test/db/archos/linux-x64/dbg_afvd | 15 +++++++++++++++ 6 files changed, 39 insertions(+), 16 deletions(-) create mode 100644 test/db/archos/linux-x64/dbg_afvd diff --git a/librz/analysis/var.c b/librz/analysis/var.c index e4dc352f21..5f643025dc 100644 --- a/librz/analysis/var.c +++ b/librz/analysis/var.c @@ -404,19 +404,6 @@ RZ_API RZ_BORROW RzAnalysisVar *rz_analysis_function_get_reg_var_at(RzAnalysisFu return rz_analysis_function_get_var_at(fcn, &stor); } -RZ_API ut64 rz_analysis_var_addr(RzAnalysisVar *var) { - rz_return_val_if_fail(var, UT64_MAX); - RzAnalysis *analysis = var->fcn->analysis; - const char *regname = NULL; - if (var->storage.type == RZ_ANALYSIS_VAR_STORAGE_STACK) { - // TODO: If bp is not available, we can also get the address from the sp - // through info available from rz_analysis_block_get_sp_at() - regname = rz_reg_get_name(analysis->reg, RZ_REG_NAME_BP); - return rz_reg_getv(analysis->reg, regname) + var->fcn->bp_off + var->storage.stack_off; - } - return UT64_MAX; -} - /** * Determine which stack variable the expression reg+reg_addend points to at the given address * using stored RzAnalysisVarAccess info. diff --git a/librz/core/canalysis.c b/librz/core/canalysis.c index df61c2c18b..8fa2dc6cbb 100644 --- a/librz/core/canalysis.c +++ b/librz/core/canalysis.c @@ -5097,6 +5097,26 @@ RZ_IPI bool rz_core_analysis_function_delete_var(RzCore *core, RzAnalysisFunctio return true; } +/** + * \brief Get the address of a stack variable. + * + * The address for stack backed variables is computed from the + * current base pointer register. Register backed variables will always + * return UT64_MAX. + * + * \param var Pointer to a \ref RzAnalysisVar. + */ +RZ_API ut64 rz_core_analysis_var_addr(RZ_NONNULL RzCore *core, RZ_NONNULL RzAnalysisVar *var) { + rz_return_val_if_fail(core && var, UT64_MAX); + if (var->storage.type == RZ_ANALYSIS_VAR_STORAGE_STACK) { + // TODO: If bp is not available, we can also get the address from the sp + // through info available from rz_analysis_block_get_sp_at() + ut64 stack = rz_core_reg_getv_by_role_or_name(core, "BP"); + return stack + var->fcn->bp_off + var->storage.stack_off; + } + return UT64_MAX; +} + RZ_API RZ_OWN char *rz_core_analysis_var_display(RZ_NONNULL RzCore *core, RZ_NONNULL RzAnalysisVar *var, bool add_name) { RzAnalysis *analysis = core->analysis; RzStrBuf *sb = rz_strbuf_new(NULL); @@ -5123,7 +5143,7 @@ RZ_API RZ_OWN char *rz_core_analysis_var_display(RZ_NONNULL RzCore *core, RZ_NON break; } case RZ_ANALYSIS_VAR_STORAGE_STACK: { - ut64 addr = rz_analysis_var_addr(var); + ut64 addr = rz_core_analysis_var_addr(core, var); char *r; if (usePxr) { // TODO: convert to API diff --git a/librz/core/cmd/cmd_type.c b/librz/core/cmd/cmd_type.c index 37233f11ef..076f19b2b3 100644 --- a/librz/core/cmd/cmd_type.c +++ b/librz/core/cmd/cmd_type.c @@ -116,7 +116,7 @@ static RzCmdStatus type_format_print_variable(RzCore *core, const char *type, co free(fmt); return RZ_CMD_STATUS_ERROR; } - ut64 addr = rz_analysis_var_addr(var); + ut64 addr = rz_core_analysis_var_addr(core, var); rz_core_cmdf(core, "pf %s @ 0x%08" PFMT64x "\n", fmt, addr); free(fmt); return RZ_CMD_STATUS_OK; diff --git a/librz/include/rz_analysis.h b/librz/include/rz_analysis.h index 91ccf9e67c..a8492928a0 100644 --- a/librz/include/rz_analysis.h +++ b/librz/include/rz_analysis.h @@ -1674,7 +1674,6 @@ RZ_API bool rz_analysis_var_rename(RzAnalysisVar *var, const char *new_name, boo RZ_API void rz_analysis_var_resolve_overlaps(RzAnalysisVar *var); RZ_API void rz_analysis_var_set_type(RzAnalysisVar *var, RZ_OWN RzType *type, bool resolve_overlaps); RZ_API void rz_analysis_var_delete(RzAnalysisVar *var); -RZ_API ut64 rz_analysis_var_addr(RzAnalysisVar *var); RZ_API void rz_analysis_var_set_access(RzAnalysisVar *var, const char *reg, ut64 access_addr, int access_type, st64 reg_addend); RZ_API void rz_analysis_var_remove_access_at(RzAnalysisVar *var, ut64 address); RZ_API void rz_analysis_var_clear_accesses(RzAnalysisVar *var); diff --git a/librz/include/rz_core.h b/librz/include/rz_core.h index ff8afb9fcd..c34e1a7e7d 100644 --- a/librz/include/rz_core.h +++ b/librz/include/rz_core.h @@ -1282,6 +1282,8 @@ RZ_API void rz_core_rtr_enable(RZ_NONNULL RzCore *core, const char *cmdremote); RZ_API RZ_OWN char *rz_core_analysis_var_to_string(RZ_NONNULL RzCore *core, RZ_NONNULL RzAnalysisVar *var); RZ_API RZ_OWN char *rz_core_analysis_var_display(RZ_NONNULL RzCore *core, RZ_NONNULL RzAnalysisVar *var, bool add_name); +RZ_API ut64 rz_core_analysis_var_addr(RZ_NONNULL RzCore *core, RZ_NONNULL RzAnalysisVar *var); + RZ_API void rz_core_sym_name_init(RZ_NONNULL RZ_OUT RzBinSymNames *names, RZ_NONNULL RzBinSymbol *symbol); RZ_API void rz_core_sym_name_fini(RZ_NULLABLE RzBinSymNames *names); diff --git a/test/db/archos/linux-x64/dbg_afvd b/test/db/archos/linux-x64/dbg_afvd new file mode 100644 index 0000000000..84a16a4c4e --- /dev/null +++ b/test/db/archos/linux-x64/dbg_afvd @@ -0,0 +1,15 @@ +NAME=dbg.afvd +FILE=bins/elf/struct64 +ARGS=-d -A +CMDS=<