diff --git a/librz/bin/dwarf/dwarf.c b/librz/bin/dwarf/dwarf.c index 320b05d339a..3bfa697bd82 100644 --- a/librz/bin/dwarf/dwarf.c +++ b/librz/bin/dwarf/dwarf.c @@ -126,7 +126,7 @@ static inline RzBinDWARF *dwarf_from_debuglink( return NULL; ok: - dw = rz_bin_dwarf_dwo_from_file(path); + dw = rz_bin_dwarf_from_path(path, false); free(dir); free(path); free(file_dir); @@ -142,7 +142,7 @@ static inline RzBinDWARF *dwarf_from_build_id( char *dir = rz_file_path_join(debug_file_directory, ".build-id"); char *path = rz_file_path_join(dir, build_id_path); if (rz_file_exists(path)) { - RzBinDWARF *dw = rz_bin_dwarf_dwo_from_file(path); + RzBinDWARF *dw = rz_bin_dwarf_from_path(path, false); free(dir); free(path); return dw; @@ -171,7 +171,8 @@ RZ_API RZ_OWN RzBinDWARF *rz_bin_dwarf_search_debug_file_directory( } char *debuglink = read_debuglink(bf); if (debuglink) { - char *file_dir = rz_file_dirname(bf->file); + char *file_abspath = rz_file_abspath(bf->file); + char *file_dir = file_abspath ? rz_file_dirname(file_abspath) : NULL; if (file_dir) { dw = dwarf_from_debuglink(file_dir, debug_file_directorys, debuglink); } @@ -189,7 +190,8 @@ RZ_API RZ_OWN RzBinDWARF *rz_bin_dwarf_search_debug_file_directory( * \param filepath The file path * \return RzBinDWARF pointer or NULL if failed */ -RZ_API RZ_OWN RzBinDWARF *rz_bin_dwarf_dwo_from_file(RZ_BORROW RZ_NONNULL const char *filepath) { +RZ_API RZ_OWN RzBinDWARF *rz_bin_dwarf_from_path( + RZ_BORROW RZ_NONNULL const char *filepath, bool is_dwo) { rz_return_val_if_fail(filepath, NULL); RzBinDWARF *dwo = NULL; @@ -203,7 +205,7 @@ RZ_API RZ_OWN RzBinDWARF *rz_bin_dwarf_dwo_from_file(RZ_BORROW RZ_NONNULL const if (!bf) { goto beach; } - dwo = dwarf_from_file(bf, true); + dwo = dwarf_from_file(bf, is_dwo); beach: rz_bin_free(bin_tmp); diff --git a/librz/core/cbin.c b/librz/core/cbin.c index 3f7e12c522f..3d8e07df98b 100644 --- a/librz/core/cbin.c +++ b/librz/core/cbin.c @@ -631,7 +631,7 @@ static inline RzBinDWARF *load_dwarf(RzCore *core, RzBinFile *binfile) { const char *dwo_path = rz_config_get(core->config, "bin.dbginfo.dwo_path"); if (RZ_STR_ISNOTEMPTY(dwo_path)) { - RzBinDWARF *dwo = rz_bin_dwarf_dwo_from_file(core->bin, dwo_path); + RzBinDWARF *dwo = rz_bin_dwarf_from_path(dwo_path, true); if (dwo) { dwo->parent = dw; return dwo; @@ -1733,7 +1733,7 @@ static bool bin_dwarf(RzCore *core, RzBinFile *binfile, RzCmdStateOutput *state) RzBinDWARF *dw = (core->analysis && core->analysis->debug_info && core->analysis->debug_info->dw) ? core->analysis->debug_info->dw - : rz_bin_dwarf_from_file(binfile); + : load_dwarf(core, binfile); if (!dw) { return false; } diff --git a/librz/include/rz_bin_dwarf.h b/librz/include/rz_bin_dwarf.h index 2c6f2933bf6..1c04c79ff85 100644 --- a/librz/include/rz_bin_dwarf.h +++ b/librz/include/rz_bin_dwarf.h @@ -1510,7 +1510,8 @@ RZ_API void rz_bin_dwarf_line_op_fini(RZ_OWN RZ_NULLABLE RzBinDwarfLineOp *op); RZ_API void rz_bin_dwarf_line_free(RZ_OWN RZ_NULLABLE RzBinDwarfLine *li); RZ_API RZ_OWN RzBinDWARF *rz_bin_dwarf_from_file(RZ_BORROW RZ_NONNULL RzBinFile *bf); -RZ_API RZ_OWN RzBinDWARF *rz_bin_dwarf_dwo_from_file(RZ_BORROW RZ_NONNULL const char *filepath); +RZ_API RZ_OWN RzBinDWARF *rz_bin_dwarf_from_path( + RZ_BORROW RZ_NONNULL const char *filepath, bool is_dwo); RZ_API RZ_OWN RzBinDWARF *rz_bin_dwarf_search_debug_file_directory( RZ_BORROW RZ_NONNULL RzBinFile *bf, RZ_BORROW RZ_NONNULL RzList /**/ *debug_file_directorys);