diff options
Diffstat (limited to 'src/format')
-rw-r--r-- | src/format/format.c | 126 | ||||
-rw-r--r-- | src/format/format.h | 6 |
2 files changed, 75 insertions, 57 deletions
diff --git a/src/format/format.c b/src/format/format.c index 9c42508..82d9e42 100644 --- a/src/format/format.c +++ b/src/format/format.c @@ -52,6 +52,9 @@ static void g_binary_format_init(GBinFormat *); /* Retire un symbole de la collection du format binaire. */ static void _g_binary_format_remove_symbol(GBinFormat *, size_t); +/* Recherche le symbole associé à une adresse. */ +static bool _g_binary_format_find_symbol(const GBinFormat *, const vmpa2t *, __compar_fn_t, GBinSymbol **); + /* Indique le type défini pour un format binaire générique. */ @@ -623,9 +626,10 @@ bool g_binary_format_find_symbol_by_label(const GBinFormat *format, const char * * * * Paramètres : format = informations chargées à consulter. * * addr = adresse à cibler lors des recherches. * +* fn = méthode de comparaison des symboles. * * symbol = éventuel symbole trouvé à déréfenrencer. [OUT] * * * -* Description : Recherche le symbole correspondant à une adresse. * +* Description : Recherche le symbole associé à une adresse. * * * * Retour : true si l'opération a été un succès, false sinon. * * * @@ -633,7 +637,7 @@ bool g_binary_format_find_symbol_by_label(const GBinFormat *format, const char * * * ******************************************************************************/ -bool g_binary_format_find_symbol_at(const GBinFormat *format, const vmpa2t *addr, GBinSymbol **symbol) +static bool _g_binary_format_find_symbol(const GBinFormat *format, const vmpa2t *addr, __compar_fn_t fn, GBinSymbol **symbol) { bool result; /* Bilan à retourner */ void *found; /* Résultat de recherches */ @@ -642,6 +646,40 @@ bool g_binary_format_find_symbol_at(const GBinFormat *format, const vmpa2t *addr *symbol = NULL; /* TODO : vérifier les doublons côtés appelants */ + found = bsearch(addr, format->symbols, format->symbols_count, sizeof(GBinSymbol *), fn); + + if (found != NULL) + { + *symbol = *(GBinSymbol **)found; + + g_object_ref(G_OBJECT(*symbol)); + result = true; + + } + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : format = informations chargées à consulter. * +* addr = adresse à cibler lors des recherches. * +* symbol = éventuel symbole trouvé à déréfenrencer. [OUT] * +* * +* Description : Recherche le symbole correspondant à une adresse. * +* * +* Retour : true si l'opération a été un succès, false sinon. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool g_binary_format_find_symbol_at(const GBinFormat *format, const vmpa2t *addr, GBinSymbol **symbol) +{ + bool result; /* Bilan à retourner */ + int find_symbol(const vmpa2t *addr, const GBinSymbol **sym) { const mrange_t *range; /* Espace mémoire parcouru */ @@ -652,19 +690,43 @@ bool g_binary_format_find_symbol_at(const GBinFormat *format, const vmpa2t *addr } - found = bsearch(addr, format->symbols, - format->symbols_count, sizeof(GBinSymbol *), - (__compar_fn_t)find_symbol); + result = _g_binary_format_find_symbol(format, addr, (__compar_fn_t)find_symbol, symbol); - if (found != NULL) + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : format = informations chargées à consulter. * +* addr = adresse à cibler lors des recherches. * +* symbol = éventuel symbole trouvé à déréfenrencer. [OUT] * +* * +* Description : Recherche le symbole contenant une adresse. * +* * +* Retour : true si l'opération a été un succès, false sinon. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool g_binary_format_find_symbol_for(const GBinFormat *format, const vmpa2t *addr, GBinSymbol **symbol) +{ + bool result; /* Bilan à retourner */ + + int find_symbol(const vmpa2t *addr, const GBinSymbol **sym) { - *symbol = *(GBinSymbol **)found; + const mrange_t *range; /* Espace mémoire parcouru */ - g_object_ref(G_OBJECT(*symbol)); - result = true; + range = g_binary_symbol_get_range(*sym); + + return cmp_mrange_with_vmpa(range, addr); } + result = _g_binary_format_find_symbol(format, addr, (__compar_fn_t)find_symbol, symbol); + return result; } @@ -734,7 +796,7 @@ bool g_binary_format_resolve_symbol(const GBinFormat *format, const vmpa2t *addr bool result; /* Bilan à retourner */ const mrange_t *range; /* Espace mémoire parcouru */ - result = g_binary_format_find_symbol_at(format, addr, symbol); + result = g_binary_format_find_symbol_for(format, addr, symbol); if (result) { @@ -916,47 +978,3 @@ void g_binary_format_decompile(const GBinFormat *format, GCodeBuffer *buffer, co } } - - -/****************************************************************************** -* * -* 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; - -} diff --git a/src/format/format.h b/src/format/format.h index 314306e..18dfda1 100644 --- a/src/format/format.h +++ b/src/format/format.h @@ -86,6 +86,9 @@ bool g_binary_format_find_symbol_by_label(const GBinFormat *, const char *, GBin /* Recherche le symbole correspondant à une adresse. */ bool g_binary_format_find_symbol_at(const GBinFormat *, const vmpa2t *, GBinSymbol **); +/* Recherche le symbole contenant une adresse. */ +bool g_binary_format_find_symbol_for(const GBinFormat *, const vmpa2t *, GBinSymbol **); + /* Recherche le symbole suivant celui lié à une adresse. */ bool g_binary_format_find_next_symbol_at(const GBinFormat *, const vmpa2t *, GBinSymbol **); @@ -107,9 +110,6 @@ const char * const *g_binary_format_get_source_files(const GBinFormat *, size_t /* Procède à la décompilation complète du format. */ void g_binary_format_decompile(const GBinFormat *, GCodeBuffer *, const char *filename); -/* Recherche une position dans une routine selon une adresse. */ -bool g_binary_format_resolve_relative_routine(const GBinFormat *, const char **, vmpa_t *); - #endif /* _FORMAT_FORMAT_H */ |