diff options
Diffstat (limited to 'src/analysis/disass')
-rw-r--r-- | src/analysis/disass/area.c | 56 |
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; } |