summaryrefslogtreecommitdiff
path: root/src/analysis/disass/area.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/analysis/disass/area.c')
-rw-r--r--src/analysis/disass/area.c56
1 files changed, 30 insertions, 26 deletions
diff --git a/src/analysis/disass/area.c b/src/analysis/disass/area.c
index 3338b03..b45e7fc 100644
--- a/src/analysis/disass/area.c
+++ b/src/analysis/disass/area.c
@@ -994,6 +994,7 @@ mem_area *compute_memory_areas(GExeFormat *format, phys_t bin_length, size_t *co
const vmpa2t *portion_start; /* Point de départ de portion */
size_t j; /* Boucle de parcours #2 */
+ SymbolType type; /* Nature d'un symbole */
const mrange_t *range; /* Couverture d'un symbole */
const vmpa2t *start; /* Point de départ du symbole */
phys_t length; /* Taille de ce même symbole */
@@ -1175,32 +1176,45 @@ mem_area *compute_memory_areas(GExeFormat *format, phys_t bin_length, size_t *co
}
- //exit(0);
-
/* Troisième étape : on insère les symboles existants */
j = 0;
-#define SKIP_EMPTY_SYMBOLS \
- for (; j < sym_count; j++) \
- { \
- range = g_binary_symbol_get_range(symbols[j]); \
- \
- length = get_mrange_length(range); \
- if (length > 0) break; \
- \
- } \
+ for (i = 0; i < *count; i++)
+ {
+ /* Sélection et écartement des symboles */
- SKIP_EMPTY_SYMBOLS
+ for (; j < sym_count; j++)
+ {
+ type = g_binary_symbol_get_target_type(symbols[j]);
- for (i = 0; i < *count && j < sym_count; i++)
- {
- range = g_binary_symbol_get_range(symbols[j]);
+ /**
+ * On ne garde que les symboles renvoyant directement une ou
+ * plusieurs instructions, c'est à dire les symboles valides
+ * pour un appel à g_binary_symbol_get_instruction().
+ *
+ * Les instructions des autres symboles sont obtenues et mises
+ * en place durant la procédure de désassemblage.
+ */
+
+ if (type == STP_ROUTINE || type == STP_ENTRY_POINT || type == STP_CODE_LABEL)
+ continue;
+
+ range = g_binary_symbol_get_range(symbols[j]);
+
+ length = get_mrange_length(range);
+
+ if (length > 0)
+ break;
+
+ }
+
+ if (j == sym_count)
+ break;
start = get_mrange_addr(range);
- length = get_mrange_length(range);
/* Si un découpage s'impose... */
@@ -1286,25 +1300,15 @@ mem_area *compute_memory_areas(GExeFormat *format, phys_t bin_length, size_t *co
}
-
-
-
-
j++;
- SKIP_EMPTY_SYMBOLS
-
}
}
-
-
if (exe_ranges != NULL)
free(exe_ranges);
- //exit(0);
-
return result;
}