diff options
Diffstat (limited to 'src/format/format.c')
-rw-r--r-- | src/format/format.c | 49 |
1 files changed, 46 insertions, 3 deletions
diff --git a/src/format/format.c b/src/format/format.c index e710668..ab5b372 100644 --- a/src/format/format.c +++ b/src/format/format.c @@ -253,7 +253,6 @@ GBinSymbol **g_binary_format_get_symbols(const GBinFormat *format, size_t *count * Paramètres : format = informations chargées à consulter. * * addr = adresse à cibler lors des recherches. * * symbol = éventuel symbole trouvé à déréfenrencer. [OUT] * -* diff = décallage entre l'adresse et le symbole. [OUT] * * * * Description : Recherche le symbole correspondant à une adresse. * * * @@ -263,7 +262,7 @@ GBinSymbol **g_binary_format_get_symbols(const GBinFormat *format, size_t *count * * ******************************************************************************/ -bool g_binary_format_resolve_symbol(const GBinFormat *format, const vmpa2t *addr, GBinSymbol **symbol, phys_t *diff) +bool g_binary_format_find_symbol_at(const GBinFormat *format, const vmpa2t *addr, GBinSymbol **symbol) { bool result; /* Bilan à retourner */ size_t i; /* Boucle de parcours */ @@ -275,11 +274,55 @@ bool g_binary_format_resolve_symbol(const GBinFormat *format, const vmpa2t *addr { range = g_binary_symbol_get_range(format->symbols[i]); - if (mrange_contains_addr(range, addr)) + if (cmp_vmpa(get_mrange_addr(range), addr) == 0) { *symbol = format->symbols[i]; 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] * +* diff = décallage entre l'adresse et le symbole. [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_resolve_symbol(const GBinFormat *format, const vmpa2t *addr, GBinSymbol **symbol, phys_t *diff) +{ + bool result; /* Bilan à retourner */ + size_t i; /* Boucle de parcours */ + const mrange_t *range; /* Espace mémoire parcouru */ + + result = false; + + //for (i = 0; i < format->symbols_count && !result; i++) + for (i = format->symbols_count; i > 0 && !result; i--) + { + range = g_binary_symbol_get_range(format->symbols[i - 1]); + + if (mrange_contains_addr(range, addr)) + { + *symbol = format->symbols[i - 1]; + g_object_ref(G_OBJECT(*symbol)); + *diff = compute_vmpa_diff(get_mrange_addr(range), addr); result = true; |