diff --git a/src/RizinScope.cpp b/src/RizinScope.cpp index 83c83218..4be88f2f 100644 --- a/src/RizinScope.cpp +++ b/src/RizinScope.cpp @@ -410,6 +410,14 @@ FunctionSymbol *RizinScope::registerFunction(RzAnalysisFunction *fcn) const return dynamic_cast(sym); } +FunctionSymbol *RizinScope::registerRelocTarget(RzBinReloc *reloc) const +{ + RzCoreLock core(arch->getCore()); + if(!reloc->import || !reloc->import->name) + return nullptr; + return cache->addFunction(Address(arch->getDefaultCodeSpace(), reloc->target_vaddr), reloc->import->name); +} + Symbol *RizinScope::registerFlag(RzFlagItem *flag) const { RzCoreLock core(arch->getCore()); @@ -516,6 +524,14 @@ Symbol *RizinScope::queryRizinAbsolute(ut64 addr, bool contain) const if(glob) return registerGlobalVar(glob); + RzBinReloc *reloc = rz_core_get_reloc_to(core, addr); + if(reloc && reloc->import) + { + auto rsym = registerRelocTarget(reloc); + if(rsym) + return rsym; + } + // TODO: register more things // TODO: correctly handle contain for flags diff --git a/src/RizinScope.h b/src/RizinScope.h index 9417cf2c..c3ef33b7 100644 --- a/src/RizinScope.h +++ b/src/RizinScope.h @@ -19,6 +19,7 @@ class RizinArchitecture; typedef struct rz_analysis_function_t RzAnalysisFunction; typedef struct rz_flag_item_t RzFlagItem; typedef struct rz_analysis_var_global_t RzAnalysisVarGlobal; +typedef struct rz_bin_reloc_t RzBinReloc; class RizinScope : public Scope { @@ -30,6 +31,7 @@ class RizinScope : public Scope uint8 makeId() const { return (*next_id)++; } FunctionSymbol *registerFunction(RzAnalysisFunction *fcn) const; + FunctionSymbol *registerRelocTarget(RzBinReloc *reloc) const; Symbol *registerFlag(RzFlagItem *flag) const; Symbol *registerGlobalVar(RzAnalysisVarGlobal *glob) const; Symbol *queryRizinAbsolute(ut64 addr, bool contain) const; diff --git a/test/db/extras/ghidra b/test/db/extras/ghidra index d530ab4a..f2e04cae 100644 --- a/test/db/extras/ghidra +++ b/test/db/extras/ghidra @@ -3262,3 +3262,22 @@ undefined8 entry0(int64_t arg1, int64_t arg2) } EOF RUN + +NAME=reloc target functions +FILE=rizin-testbins/elf/linux-example-x86-32.ko +CMDS=<