summaryrefslogtreecommitdiff
path: root/src/format
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2015-12-16 17:20:06 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2015-12-16 17:20:06 (GMT)
commit7c40b70d6c1e1e13dadf876c8dda60b525616d47 (patch)
tree743d0b1981a13fb2de0d2eaacc4f644cf84204c0 /src/format
parent4d313d845a60e908b9e2723cc1fe2bdbbdded315 (diff)
Built a new improved status bar for instructions information.
Diffstat (limited to 'src/format')
-rw-r--r--src/format/format.c126
-rw-r--r--src/format/format.h6
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 */