diff options
Diffstat (limited to 'src/format')
-rw-r--r-- | src/format/format.c | 44 | ||||
-rw-r--r-- | src/format/format.h | 3 |
2 files changed, 47 insertions, 0 deletions
diff --git a/src/format/format.c b/src/format/format.c index c7d95c4..79ef5dd 100644 --- a/src/format/format.c +++ b/src/format/format.c @@ -454,6 +454,50 @@ bool g_binary_format_resolve_symbol(const GBinFormat *format, const char **label } +/****************************************************************************** +* * +* Paramètres : format = informations chargées à consulter. * +* label = étiquette du symbole si trouvé. [OUT] * +* address = adresse à cibler, puis décallage final. [OUT] * +* * +* Description : Recherche une position dans une routine selon une adresse. * +* * +* Retour : true si l'opération a été un succès, false sinon. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool g_binary_format_resolve_relative_routine(const GBinFormat *format, const char **label, vmpa_t *address) +{ + bool result; /* Bilan à retourner */ + size_t i; /* Boucle de parcours */ + vmpa_t addr; /* Adresse de symbole */ + off_t size; /* Taille du symole */ + + result = false; + + for (i = 0; i < format->routines_count && !result; i++) + { + addr = g_binary_routine_get_address(format->routines[i]); + size = g_binary_routine_get_size(format->routines[i]); + + if (addr <= *address && *address < (addr + size)) + { + *label = g_binary_routine_get_long_name(format->routines[i]); + *address -= addr; + + result = true; + + } + + } + + return result; + +} + + /* ---------------------------------------------------------------------------------- */ /* MANIPULATION D'ENSEMBLE DE FORMATS */ diff --git a/src/format/format.h b/src/format/format.h index ef85fbb..fec03ea 100644 --- a/src/format/format.h +++ b/src/format/format.h @@ -84,6 +84,9 @@ void g_binary_format_decompile(const GBinFormat *, GCodeBuffer *, const char *fi /* Recherche le symbole correspondant à une adresse. */ bool g_binary_format_resolve_symbol(const GBinFormat *, const char **, SymbolType *, vmpa_t *); +/* Recherche une position dans une routine selon une adresse. */ +bool g_binary_format_resolve_relative_routine(const GBinFormat *, const char **, vmpa_t *); + /* ----------------------- MANIPULATION D'ENSEMBLE DE FORMATS ----------------------- */ |