diff options
| author | Cyrille Bagard <nocbos@gmail.com> | 2015-10-14 19:33:06 (GMT) | 
|---|---|---|
| committer | Cyrille Bagard <nocbos@gmail.com> | 2015-10-14 19:33:06 (GMT) | 
| commit | c9449c389834c580196527c4e1cb010a701e7a32 (patch) | |
| tree | 224396e26a8fc11a6106c754b3870f854b7796f2 /src/analysis/disass | |
| parent | 48726043e2f07874e7a09a866c4cc537a65a683c (diff) | |
Discarded code symbols as symbols already containing instructions when disassembling.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@595 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
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;  }  | 
