diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2015-01-30 23:37:39 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2015-01-30 23:37:39 (GMT) |
commit | d246c98c515cb44c5bc4c742a674bae2e824872b (patch) | |
tree | 2ea1ec27ae5fba761ee778ba4ddb85c7752ebbf5 /src/format | |
parent | 262c95e0b088a56e9fd919edc57ad19f85e2e40e (diff) |
Bound a symbol for each loaded value for 'ldr' instructions.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@462 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/format')
-rw-r--r-- | src/format/format.c | 49 | ||||
-rw-r--r-- | src/format/format.h | 3 | ||||
-rw-r--r-- | src/format/symbol.c | 77 | ||||
-rw-r--r-- | src/format/symbol.h | 6 |
4 files changed, 132 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; diff --git a/src/format/format.h b/src/format/format.h index 364f71a..9b2e0f6 100644 --- a/src/format/format.h +++ b/src/format/format.h @@ -68,6 +68,9 @@ void g_binary_format_add_symbol(GBinFormat *, GBinSymbol *); GBinSymbol **g_binary_format_get_symbols(const GBinFormat *, size_t *); /* Recherche le symbole correspondant à une adresse. */ +bool g_binary_format_find_symbol_at(const GBinFormat *, const vmpa2t *, GBinSymbol **); + +/* Recherche le symbole correspondant à une adresse. */ bool g_binary_format_resolve_symbol(const GBinFormat *, const vmpa2t *, GBinSymbol **, phys_t *); /* Ajoute une routine à la collection du format binaire. */ diff --git a/src/format/symbol.c b/src/format/symbol.c index 5e66c54..1e6063f 100644 --- a/src/format/symbol.c +++ b/src/format/symbol.c @@ -24,6 +24,7 @@ #include "symbol.h" +#include <assert.h> #include <string.h> @@ -290,6 +291,63 @@ const char *g_binary_symbol_get_label(const GBinSymbol *symbol) /****************************************************************************** * * +* Paramètres : symbol = symbole à venir mettre à jour. * +* full = adresse dont la définition est complète. * +* * +* Description : Raffine la définition de l'emplacement d'un symbole. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void g_binary_symbol_fix_range(GBinSymbol *symbol, const vmpa2t *full) +{ + GArchInstruction *instr; /* Instruction associée */ + mrange_t range; /* Plage à manipuler */ + GBinRoutine *routine; /* Routine associée */ + + switch (symbol->type) + { + case STP_DATA: + + instr = g_binary_symbol_get_instruction(symbol); + + copy_mrange(&range, g_arch_instruction_get_range(instr)); + + assert(cmp_vmpa(get_mrange_addr(&range), full) == 0); + + copy_vmpa(get_mrange_addr(&range), full); + + g_arch_instruction_set_range(instr, &range); + + break; + + case STP_ROUTINE: + + routine = g_binary_symbol_get_routine(symbol); + + copy_mrange(&range, g_binary_routine_get_range(routine)); + + assert(cmp_vmpa(get_mrange_addr(&range), full) == 0); + + copy_vmpa(get_mrange_addr(&range), full); + + g_binary_routine_set_range(routine, &range); + + break; + + default: + break; + + } + +} + + +/****************************************************************************** +* * * Paramètres : symbol = symbole à venir consulter. * * * * Description : Fournit l'emplacement où se situe un symbole. * @@ -393,6 +451,25 @@ void g_binary_symbol_attach_instruction(GBinSymbol *symbol, GArchInstruction *in * * * Paramètres : symbol = symbole à venir consulter. * * * +* Description : Fournit l'éventuelle routine associée au symbole. * +* * +* Retour : - * +* * +* Remarques : Il n'y a pas de transfert de propriété ici ! * +* * +******************************************************************************/ + +GBinRoutine *g_binary_symbol_get_routine(const GBinSymbol *symbol) +{ + return symbol->extra.routine; + +} + + +/****************************************************************************** +* * +* Paramètres : symbol = symbole à venir consulter. * +* * * Description : Fournit l'éventuelle instruction associée au symbole. * * * * Retour : - * diff --git a/src/format/symbol.h b/src/format/symbol.h index ac1ff0d..c5bf750 100644 --- a/src/format/symbol.h +++ b/src/format/symbol.h @@ -81,6 +81,9 @@ vmpa_t g_binary_symbol_get_address(const GBinSymbol *); /////////////////// /* Fournit un étiquette pour viser un symbole. */ const char *g_binary_symbol_get_label(const GBinSymbol *); +/* Raffine la définition de l'emplacement d'un symbole. */ +void g_binary_symbol_fix_range(GBinSymbol *, const vmpa2t *); + /* Fournit l'emplacement où se situe un symbole. */ const mrange_t *g_binary_symbol_get_range(const GBinSymbol *); @@ -93,6 +96,9 @@ void g_binary_symbol_attach_routine(GBinSymbol *, GBinRoutine *); /* Attache l'instruction associée au symbole. */ void g_binary_symbol_attach_instruction(GBinSymbol *, GArchInstruction *); +/* Fournit l'éventuelle routine associée au symbole. */ +GBinRoutine *g_binary_symbol_get_routine(const GBinSymbol *); + /* Fournit l'éventuelle instruction associée au symbole. */ GArchInstruction *g_binary_symbol_get_instruction(const GBinSymbol *); |