diff options
Diffstat (limited to 'src/analysis')
-rw-r--r-- | src/analysis/disass/area.c | 28 | ||||
-rw-r--r-- | src/analysis/disass/output.c | 26 |
2 files changed, 38 insertions, 16 deletions
diff --git a/src/analysis/disass/area.c b/src/analysis/disass/area.c index d2a03c6..c79b293 100644 --- a/src/analysis/disass/area.c +++ b/src/analysis/disass/area.c @@ -707,9 +707,11 @@ mem_area_v2 *compute_memory_areas_v2(const GLoadedBinary *binary, phys_t bin_len const vmpa2t *border; /* Nouvelle bordure rencontrée */ mem_area_v2 *area; /* Zone avec valeurs à éditer */ vmpa2t tmp; /* Stockage temporaire */ + GPortionLayer *layer; /* Couche première de portions */ GBinPortion **portions; /* Morceaux d'encadrement */ size_t portions_count; /* Taille de cette liste */ const vmpa2t *portion_start; /* Point de départ de portion */ + const vmpa2t *portion_next; /* Départ de portion suivante */ size_t j; /* Boucle de parcours #2 */ SymbolType type; /* Nature d'un symbole */ const mrange_t *range; /* Couverture d'un symbole */ @@ -813,7 +815,9 @@ mem_area_v2 *compute_memory_areas_v2(const GLoadedBinary *binary, phys_t bin_len /* Seconde étape : on s'assure du découpage autour des portions pour respecter l'alignement */ - portions = g_exe_format_get_portions_at_level(format, -1, &portions_count); + layer = g_exe_format_get_main_layer(format); + + portions = g_portion_layer_collect_all_portions(layer, &portions_count); for (i = 1; i < portions_count; i++) { @@ -824,6 +828,20 @@ mem_area_v2 *compute_memory_areas_v2(const GLoadedBinary *binary, phys_t bin_len (unsigned int)get_phy_addr(portion_start), (unsigned int)get_virt_addr(portion_start)); + + /** + * Si plusieurs portions débutent au même endroit, il ne sert + * à rien de découper plusieurs fois. + */ + if ((i + 1) < portions_count) + { + portion_next = get_mrange_addr(g_binary_portion_get_range(portions[i + 1])); + + if (cmp_vmpa(portion_start, portion_next) == 0) + continue; + + } + for (j = 0; j < *count; j++) { area = &result[j]; @@ -871,7 +889,10 @@ mem_area_v2 *compute_memory_areas_v2(const GLoadedBinary *binary, phys_t bin_len } + if (portions != NULL) + free(portions); + g_object_unref(G_OBJECT(layer)); @@ -928,9 +949,6 @@ mem_area_v2 *compute_memory_areas_v2(const GLoadedBinary *binary, phys_t bin_len /* Nettoyage final */ - if (portions != NULL) - free(portions); - if (exe_ranges != NULL) free(exe_ranges); @@ -2193,7 +2211,7 @@ mem_area *compute_memory_areas(GExeFormat *format, phys_t bin_length, size_t *co printf("--------------------\n"); - portions = g_exe_format_get_portions_at_level(format, -1, &portions_count); + portions = NULL;//g_exe_format_get_portions_at_level(format, -1, &portions_count); for (i = 1; i < portions_count; i++) diff --git a/src/analysis/disass/output.c b/src/analysis/disass/output.c index 727c34f..67a3ce8 100644 --- a/src/analysis/disass/output.c +++ b/src/analysis/disass/output.c @@ -56,6 +56,14 @@ void print_disassembled_instructions(GCodeBuffer *buffer, const GExeFormat *format, GArchProcessor *proc, const GArchInstruction *instrs, GBinRoutine * const *routines, size_t count, GtkExtStatusBar *statusbar, bstatus_id_t id) { GLangOutput *output; /* Modèle de sortie adéquat */ + GPortionLayer *layer; /* Couche première de portions */ + GBinPortion **portions; /* Morceaux d'encadrement */ + size_t portions_count; /* Taille de cette liste */ + size_t portion_index; /* Prochaine portion à traiter */ + GBinSymbol **symbols; /* Symboles à représenter */ + size_t sym_count; /* Qté de symboles présents */ + size_t sym_index; /* Prochain symbole non traité */ + //GArchProcessor *proc; /* Architecture du binaire */ MemoryDataSize msize; /* Taille du bus d'adresses */ const GBinContent *content; /* Contenu binaire global */ @@ -74,13 +82,6 @@ void print_disassembled_instructions(GCodeBuffer *buffer, const GExeFormat *form GBufferLine *line; - GBinPortion **portions; /* Morceaux d'encadrement */ - size_t portions_count; /* Taille de cette liste */ - size_t portion_index; /* Prochaine portion à traiter */ - - GBinSymbol **symbols; /* Symboles à représenter */ - size_t sym_count; /* Qté de symboles présents */ - size_t sym_index; /* Prochain symbole non traité */ const vmpa2t *paddr; /* Adresse de portion */ @@ -100,12 +101,12 @@ void print_disassembled_instructions(GCodeBuffer *buffer, const GExeFormat *form output = g_asm_output_new(); + layer = g_exe_format_get_main_layer(format); - - portions = g_exe_format_get_portions_at_level(format, -1, &portions_count); + portions = g_portion_layer_collect_all_portions(layer, &portions_count); portion_index = 0; - symbols = g_binary_format_get_symbols(format, &sym_count); + symbols = g_binary_format_get_symbols(G_BIN_FORMAT(format), &sym_count); sym_index = 0; #if 0 @@ -294,7 +295,10 @@ void print_disassembled_instructions(GCodeBuffer *buffer, const GExeFormat *form g_object_unref(G_OBJECT(content)); - /* free portions... */ + if (portions != NULL) + free(portions); + + g_object_unref(G_OBJECT(layer)); g_object_unref(G_OBJECT(output)); |