summaryrefslogtreecommitdiff
path: root/src/format
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2015-01-30 23:37:39 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2015-01-30 23:37:39 (GMT)
commitd246c98c515cb44c5bc4c742a674bae2e824872b (patch)
tree2ea1ec27ae5fba761ee778ba4ddb85c7752ebbf5 /src/format
parent262c95e0b088a56e9fd919edc57ad19f85e2e40e (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.c49
-rw-r--r--src/format/format.h3
-rw-r--r--src/format/symbol.c77
-rw-r--r--src/format/symbol.h6
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 *);