diff options
Diffstat (limited to 'src/format')
| -rw-r--r-- | src/format/dex/class.c | 16 | ||||
| -rw-r--r-- | src/format/dex/method.c | 4 | ||||
| -rw-r--r-- | src/format/dex/method.h | 1 | ||||
| -rw-r--r-- | src/format/dex/pool.c | 36 | ||||
| -rw-r--r-- | src/format/dex/pool.h | 2 | ||||
| -rw-r--r-- | src/format/dwarf/symbols.c | 10 | ||||
| -rw-r--r-- | src/format/elf/helper_arm.c | 17 | ||||
| -rw-r--r-- | src/format/elf/helper_x86.c | 6 | ||||
| -rw-r--r-- | src/format/elf/strings.c | 11 | ||||
| -rw-r--r-- | src/format/elf/symbols.c | 24 | ||||
| -rw-r--r-- | src/format/format.c | 9 | ||||
| -rw-r--r-- | src/format/symbol-int.h | 16 | ||||
| -rw-r--r-- | src/format/symbol.c | 244 | ||||
| -rw-r--r-- | src/format/symbol.h | 56 | 
14 files changed, 138 insertions, 314 deletions
diff --git a/src/format/dex/class.c b/src/format/dex/class.c index 897720a..eb2ba3f 100644 --- a/src/format/dex/class.c +++ b/src/format/dex/class.c @@ -196,11 +196,11 @@ GDexClass *g_dex_class_new(GDexFormat *format, const class_def_item *def)      vmpa2t addr;                            /* Tête de lecture générique   */      class_data_item data;                   /* Contenu de la classe        */      GDataType *ctype;                       /* Type créé par la classe     */ +    GBinFormat *base;                       /* Autre version du format     */      uleb128_t index;                        /* Conservation du dernier id  */      uleb128_t i;                            /* Boucle de parcours          */      GDexMethod *method;                     /* Méthode chargée             */      GBinRoutine *routine;                   /* Version interne de méthode  */ -    GBinSymbol *symbol;                     /* Nouveau symbole construit   */      result = g_object_new(G_TYPE_DEX_CLASS, NULL); @@ -235,6 +235,8 @@ GDexClass *g_dex_class_new(GDexFormat *format, const class_def_item *def)      ctype = get_type_from_dex_pool(format, def->class_idx);      assert(ctype != NULL); +    base = G_BIN_FORMAT(format); +      index = 0;      result->dmethods_count = data.direct_methods_size; @@ -255,10 +257,7 @@ GDexClass *g_dex_class_new(GDexFormat *format, const class_def_item *def)              g_object_ref(G_OBJECT(ctype));              g_binary_routine_set_namespace(routine, ctype, "."); -            symbol = g_binary_symbol_new(STP_ROUTINE); -            g_binary_symbol_attach_routine(symbol, routine); - -            g_binary_format_add_symbol(G_BIN_FORMAT(format), symbol); +            g_binary_format_add_symbol(base, G_BIN_SYMBOL(routine));          } @@ -284,10 +283,7 @@ GDexClass *g_dex_class_new(GDexFormat *format, const class_def_item *def)              g_object_ref(G_OBJECT(ctype));              g_binary_routine_set_namespace(routine, ctype, "."); -            symbol = g_binary_symbol_new(STP_ROUTINE); -            g_binary_symbol_attach_routine(symbol, routine); - -            g_binary_format_add_symbol(G_BIN_FORMAT(format), symbol); +            g_binary_format_add_symbol(base, G_BIN_SYMBOL(routine));          } @@ -493,7 +489,7 @@ const char *g_dex_class_get_source_file(const GDexClass *class, const GDexFormat  {      const char *result;                     /* Trouvaille à renvoyer       */ -    result = get_string_from_dex_pool(format, class->definition.source_file_idx); +    result = get_string_from_dex_pool(format, class->definition.source_file_idx, NULL);      return result; diff --git a/src/format/dex/method.c b/src/format/dex/method.c index be99479..f487c0a 100644 --- a/src/format/dex/method.c +++ b/src/format/dex/method.c @@ -212,7 +212,7 @@ GDexMethod *g_dex_method_new_defined(GDexFormat *format, const encoded_method *s          result->offset = ins_offset;          init_mrange(&range, &addr, item.insns_size * sizeof(uint16_t)); -        g_binary_routine_set_range(result->routine, &range); +        g_binary_symbol_set_range(G_BIN_SYMBOL(result->routine), &range);      } @@ -252,7 +252,7 @@ GDexMethod *g_dex_method_new_callable(GDexFormat *format, const method_id_item *      result = NULL; -    name = get_string_from_dex_pool(format, method_id->name_idx); +    name = get_string_from_dex_pool(format, method_id->name_idx, NULL);      if (name == NULL) goto gdmne_exit;      routine = get_prototype_from_dex_pool(format, method_id->proto_idx); diff --git a/src/format/dex/method.h b/src/format/dex/method.h index e5b8634..47e90b8 100644 --- a/src/format/dex/method.h +++ b/src/format/dex/method.h @@ -30,6 +30,7 @@  #include "dex.h"  #include "dex_def.h" +#include "../../analysis/routine.h" diff --git a/src/format/dex/pool.c b/src/format/dex/pool.c index 9a99cc8..0180b19 100644 --- a/src/format/dex/pool.c +++ b/src/format/dex/pool.c @@ -52,19 +52,29 @@  bool find_all_dex_strings(GDexFormat *format)  { +    GBinFormat *base;                       /* Autre version du format     */      uint32_t i;                             /* Boucle de parcours          */ +    mrange_t range;                         /* Couverture associée         */      const char *text;                       /* Texte issu du binaire       */      GBinSymbol *symbol;                     /* Nouveau symbole construit   */ +    char *label;                            /* Désignation de la chaîne    */ + +    base = G_BIN_FORMAT(format);      for (i = 0; i < format->header.string_ids_size; i++)      { -        text = get_string_from_dex_pool(format, i); +        text = get_string_from_dex_pool(format, i, &range);          if (text == NULL) continue; -        symbol = g_binary_symbol_new(STP_STRING); -        g_binary_symbol_set_alt_label(symbol, text); +        symbol = g_binary_symbol_new(&range, STP_STRING); + +        label = create_string_label(base, get_mrange_addr(&range), get_mrange_length(&range)); + +        g_binary_symbol_set_alt_label(symbol, label); -        g_binary_format_add_symbol(G_BIN_FORMAT(format), symbol); +        free(label); + +        g_binary_format_add_symbol(base, symbol);      } @@ -77,6 +87,7 @@ bool find_all_dex_strings(GDexFormat *format)  *                                                                             *  *  Paramètres  : format = représentation interne du format DEX à consulter.   *  *                index  = index du type recherchée.                           * +*                range  = éventuelle couverture à renseigner ou NULL. [OUT]   *  *                                                                             *  *  Description : Extrait une chaîne de caractères d'une table DEX.            *  *                                                                             * @@ -86,12 +97,14 @@ bool find_all_dex_strings(GDexFormat *format)  *                                                                             *  ******************************************************************************/ -const char *get_string_from_dex_pool(const GDexFormat *format, uint32_t index) +const char *get_string_from_dex_pool(const GDexFormat *format, uint32_t index, mrange_t *range)  {      off_t pos;                              /* Tête de lecture             */      vmpa2t addr;                            /* Tête de lecture générique   */      string_id_item str_id;                  /* Identifiant de chaîne       */      string_data_item str_data;              /* Description de chaîne       */ +    vmpa2t start;                           /* Début de la chaîne          */ +    phys_t diff;                            /* Avancée de tête de lecture  */      if (index >= format->header.string_ids_size)          return NULL; @@ -108,6 +121,15 @@ const char *get_string_from_dex_pool(const GDexFormat *format, uint32_t index)      if (!read_dex_string_data_item(format, &addr, &str_data))          return NULL; +    if (range != NULL) +    { +        init_vmpa(&start, pos, VMPA_NO_VIRTUAL); +        diff = compute_vmpa_diff(&start, &addr); + +        init_mrange(range, &start, diff); + +    } +      return (const char *)str_data.data;  } @@ -362,7 +384,7 @@ GBinVariable *get_field_from_dex_pool(GDexFormat *format, uint32_t index)          type = get_type_from_dex_pool(format, field_id.type_idx);          if (type == NULL) goto gffdp_error; -        name = get_string_from_dex_pool(format, field_id.name_idx); +        name = get_string_from_dex_pool(format, field_id.name_idx, NULL);          if (name == NULL) goto gffdp_bad_name;          field = g_binary_variable_new(type); @@ -452,7 +474,7 @@ GBinRoutine *get_prototype_from_dex_pool(GDexFormat *format, uint32_t index)      /* Nom de la méthode */ -    name = get_string_from_dex_pool(format, proto_id.shorty_idx); +    name = get_string_from_dex_pool(format, proto_id.shorty_idx, NULL);      /* Liste des arguments */ diff --git a/src/format/dex/pool.h b/src/format/dex/pool.h index 68fecc3..207f88c 100644 --- a/src/format/dex/pool.h +++ b/src/format/dex/pool.h @@ -37,7 +37,7 @@  bool find_all_dex_strings(GDexFormat *);  /* Extrait une chaîne de caractères d'une table DEX. */ -const char *get_string_from_dex_pool(const GDexFormat *, uint32_t); +const char *get_string_from_dex_pool(const GDexFormat *, uint32_t, mrange_t *); diff --git a/src/format/dwarf/symbols.c b/src/format/dwarf/symbols.c index 16ff087..d26cc3e 100644 --- a/src/format/dwarf/symbols.c +++ b/src/format/dwarf/symbols.c @@ -111,11 +111,9 @@ static bool load_routine_as_symbol_from_dwarf(GDwarfFormat *format, const dw_die      /* Intégration en bonne et due forme */      routine = try_to_demangle_routine(name); +    symbol = G_BIN_SYMBOL(routine); -    g_binary_routine_set_range(routine, &range); - -    symbol = g_binary_symbol_new(STP_ROUTINE); -    g_binary_symbol_attach_routine(symbol, routine); +    g_binary_symbol_set_range(symbol, &range);      g_binary_format_add_symbol(G_BIN_FORMAT(format), symbol); @@ -221,9 +219,9 @@ static bool load_object_as_symbol_from_dwarf(GDwarfFormat *format, const dw_die      /*      routine = try_to_demangle_routine(name); -    g_binary_routine_set_range(routine, &range); +    g_binary_symbol_set_range(G_BIN_SYMBOL(routine), &range); -    symbol = g_binary_symbol_new(STP_OBJECT); +    symbol = g_binary_symbol_new(NULL, STP_OBJECT);      g_binary_symbol_attach_routine(symbol, routine);      g_binary_format_add_symbol(G_BIN_FORMAT(format), symbol); diff --git a/src/format/elf/helper_arm.c b/src/format/elf/helper_arm.c index a08c473..734a2bb 100644 --- a/src/format/elf/helper_arm.c +++ b/src/format/elf/helper_arm.c @@ -55,6 +55,7 @@ bool load_elf_arm_relocated_symbols(GElfFormat *format, const elf_shdr *relxxx,      bool result;                            /* Bilan à retourner           */      phys_t rel_start;                       /* Début de la zone à traiter  */      phys_t rel_size;                        /* Taille de cette même zone   */ +    GBinFormat *base;                       /* Autre version du format     */      phys_t iter;                            /* Boucle de parcours          */      elf_rel reloc;                          /* Infos de relocalisation     */      off_t index;                            /* Indice de la portion visée  */ @@ -67,9 +68,9 @@ bool load_elf_arm_relocated_symbols(GElfFormat *format, const elf_shdr *relxxx,      virt_t final_virt;                      /* Adresse virtuelle retenue   */      bool status;                            /* Bilan d'une opération       */      vmpa2t addr;                            /* Localisation d'une routine  */ -    mrange_t range;                         /* Couverture mémoire associée */      GBinRoutine *routine;                   /* Nouvelle routine trouvée    */      GBinSymbol *symbol;                     /* Nouveau symbole construit   */ +    mrange_t range;                         /* Couverture mémoire associée */ @@ -80,6 +81,7 @@ bool load_elf_arm_relocated_symbols(GElfFormat *format, const elf_shdr *relxxx,      get_elf_section_content(format, relxxx, &rel_start, &rel_size, NULL); +    base = G_BIN_FORMAT(format);      for (iter = rel_start; iter < (rel_start + rel_size); )      { @@ -110,17 +112,14 @@ bool load_elf_arm_relocated_symbols(GElfFormat *format, const elf_shdr *relxxx,                  status = g_exe_format_translate_address_into_vmpa(G_EXE_FORMAT(format), final_virt, &addr);                  if (!status) continue; -                init_mrange(&range, &addr, 0); -                  routine = try_to_demangle_routine(name); +                symbol = G_BIN_SYMBOL(routine); -                g_binary_routine_set_range(routine, &range); - -                symbol = g_binary_symbol_new(STP_ROUTINE); -                g_binary_symbol_attach_routine(symbol, routine); +                init_mrange(&range, &addr, 0); +                g_binary_symbol_set_range(symbol, &range);                  /* Comptabilisation pour le désassemblage brut */ -                g_binary_format_register_code_point(G_BIN_FORMAT(format), virt, false); +                g_binary_format_register_code_point(base, virt, false);                  break; @@ -132,7 +131,7 @@ bool load_elf_arm_relocated_symbols(GElfFormat *format, const elf_shdr *relxxx,          }          if (symbol != NULL) -            g_binary_format_add_symbol(G_BIN_FORMAT(format), symbol); +            g_binary_format_add_symbol(base, symbol);      } diff --git a/src/format/elf/helper_x86.c b/src/format/elf/helper_x86.c index 826ac40..ba37bcb 100644 --- a/src/format/elf/helper_x86.c +++ b/src/format/elf/helper_x86.c @@ -140,7 +140,7 @@ bool load_elf_x86_relocated_symbols(GElfFormat *format, const elf_shdr *relxxx,                      name = "unknown";                  } -                symbol = g_binary_symbol_new(STP_ROUTINE); +                symbol = g_binary_symbol_new(NULL, STP_ROUTINE);                  g_binary_format_add_symbol(G_BIN_FORMAT(format), symbol);                  break; @@ -323,7 +323,7 @@ void translate_exe_elf_relocations(GElfFormat *format, GArchInstruction **instru                          /* Symbole uniquement */ -                        symbol = g_binary_symbol_new(STP_ROUTINE); +                        symbol = g_binary_symbol_new(NULL, STP_ROUTINE);                          g_binary_symbol_attach_routine(symbol, routine); @@ -431,7 +431,7 @@ void translate_dyn_elf_relocations(GElfFormat *format, GArchInstruction **instru              /* Symbole uniquement */ -            symbol = g_binary_symbol_new(STP_ROUTINE); +            symbol = g_binary_symbol_new(NULL, STP_ROUTINE);              g_binary_symbol_attach_routine(symbol, routine); diff --git a/src/format/elf/strings.c b/src/format/elf/strings.c index d350200..53d4e92 100644 --- a/src/format/elf/strings.c +++ b/src/format/elf/strings.c @@ -159,6 +159,7 @@ static bool parse_elf_string_data(GElfFormat *format, phys_t start, phys_t size,      phys_t i;                               /* Boucle de parcours          */      phys_t end;                             /* Position de fin de chaîne   */      GArchInstruction *instr;                /* Instruction décodée         */ +    const mrange_t *range;                  /* Espace occupé par une chaîne*/      GBinSymbol *symbol;                     /* Symbole à intégrer          */      char *label;                            /* Désignation de la chaîne    */ @@ -204,16 +205,16 @@ static bool parse_elf_string_data(GElfFormat *format, phys_t start, phys_t size,              g_preload_info_add_instruction(base->info, instr); -            g_object_ref(G_OBJECT(instr)); -            ADD_STR_AS_SYM(format, symbol, instr); +            range = g_arch_instruction_get_range(instr); + +            symbol = g_binary_symbol_new(range, STP_RO_STRING); +            g_binary_format_add_symbol(base, symbol);              /* Jointure avec la chaîne précédente ? */              if (cut)              { -                init_vmpa(&pos, start + i, address + i); - -                label = create_string_label(base, &pos, end - i); +                label = create_string_label(base, get_mrange_addr(range), end - i);                  g_binary_symbol_set_alt_label(symbol, label); diff --git a/src/format/elf/symbols.c b/src/format/elf/symbols.c index 8451911..62fae58 100644 --- a/src/format/elf/symbols.c +++ b/src/format/elf/symbols.c @@ -207,27 +207,19 @@ static void register_elf_entry_point(GElfFormat *format, virt_t vaddr, phys_t le      /* Comptabilisation en tant que symbole */      if (g_binary_format_find_symbol_at(G_BIN_FORMAT(format), &addr, &symbol)) -    {          g_object_unref(G_OBJECT(routine)); -        routine = g_binary_symbol_get_routine(symbol); -        g_object_ref(G_OBJECT(routine)); - -        _g_binary_symbol_attach_routine(symbol, routine, STP_ENTRY_POINT); - -        g_object_unref(G_OBJECT(symbol)); - -    }      else      {          base = G_BIN_FORMAT(format);          init_mrange(&range, &addr, len); -        g_binary_routine_set_range(routine, &range); +        symbol = G_BIN_SYMBOL(routine); + +        g_binary_symbol_set_range(symbol, &range); +        g_binary_symbol_set_target_type(symbol, STP_ENTRY_POINT); -        symbol = g_binary_symbol_new(STP_ENTRY_POINT); -        g_binary_symbol_attach_routine(symbol, routine);          g_binary_format_add_symbol(base, symbol);          /* Comptabilisation pour le désassemblage brut */ @@ -652,13 +644,9 @@ static bool do_elf_internal_symbol_loading(GElfLoading *loading, GElfFormat *for              /* Routine */              routine = try_to_demangle_routine(name); +            symbol = G_BIN_SYMBOL(routine); -            g_binary_routine_set_range(routine, &range); - -            /* Symbole uniquement */ - -            symbol = g_binary_symbol_new(STP_ROUTINE); -            g_binary_symbol_attach_routine(symbol, routine); +            g_binary_symbol_set_range(symbol, &range);              /* Comptabilisation pour le désassemblage brut */ diff --git a/src/format/format.c b/src/format/format.c index 4dc6416..5d845e4 100644 --- a/src/format/format.c +++ b/src/format/format.c @@ -320,7 +320,6 @@ bool g_binary_format_add_symbol(GBinFormat *format, GBinSymbol *symbol)      const vmpa2t *addr;                     /* Emplacement du symbole      */  #endif      size_t index;                           /* Indice du point d'insertion */ -    GBinRoutine *routine;                   /* Nouvelle routine à insérer  */      /**       * Pour que les fonctions de recherche basées sur _g_binary_format_find_symbol() @@ -396,17 +395,11 @@ bool g_binary_format_add_symbol(GBinFormat *format, GBinSymbol *symbol)  static void _g_binary_format_remove_symbol(GBinFormat *format, size_t index)  { -    GBinSymbol *symbol;                     /* Symbole visé par l'opération*/ -    GBinRoutine *routine;                   /* Eventuelle routine associée */ -    size_t i;                               /* Boucle de parcours          */ -      /**       * TODO : envoyer un signal pour avertir les opérandes concernées.       * TODO : vérifier les conditions d'accès (verrou).       */ -    symbol = format->symbols[index]; -      assert(index < format->symbols_count);      if ((index + 1) < format->symbols_count) @@ -436,6 +429,8 @@ void g_binary_format_remove_symbol(GBinFormat *format, GBinSymbol *symbol)  {      size_t i;                               /* Boucle de parcours          */ +    // FIXME : dicho +      for (i = 0; i < format->symbols_count; i++)          if (format->symbols[i] == symbol)              break; diff --git a/src/format/symbol-int.h b/src/format/symbol-int.h index 4a79a65..49a0b97 100644 --- a/src/format/symbol-int.h +++ b/src/format/symbol-int.h @@ -29,22 +29,21 @@ +/* Fournit une étiquette pour viser un symbole. */ +typedef const char * (* get_symbol_label_fc) (GBinSymbol *); + + +  /* Symbole d'exécutable (instance) */  struct _GBinSymbol  {      GObject parent;                         /* A laisser en premier        */ +    mrange_t range;                         /* Couverture mémoire          */      SymbolType type;                        /* Type du symbole             */      char *alt;                              /* Nom alternatif              */ -    union -    { -        GArchInstruction *instr;            /* Instruction correspondante  */ -        GBinRoutine *routine;               /* Compléments pour fonction   */ - -    } extra; -  };  /* Symbole d'exécutable (classe) */ @@ -52,8 +51,9 @@ struct _GBinSymbolClass  {      GObjectClass parent;                    /* A laisser en premier        */ -}; +    get_symbol_label_fc get_label;          /* Obtention d'une étiquette   */ +}; diff --git a/src/format/symbol.c b/src/format/symbol.c index ba0c327..0b300bd 100644 --- a/src/format/symbol.c +++ b/src/format/symbol.c @@ -121,6 +121,7 @@ static void g_binary_symbol_class_init(GBinSymbolClass *klass)  static void g_binary_symbol_init(GBinSymbol *symbol)  { +    g_binary_symbol_set_target_type(symbol, STP_COUNT);  } @@ -162,8 +163,6 @@ static void g_binary_symbol_interface_init(GLineGeneratorInterface *iface)  static void g_binary_symbol_dispose(GBinSymbol *symbol)  { -    /* TODO... */ -      G_OBJECT_CLASS(g_binary_symbol_parent_class)->dispose(G_OBJECT(symbol));  } @@ -183,7 +182,8 @@ static void g_binary_symbol_dispose(GBinSymbol *symbol)  static void g_binary_symbol_finalize(GBinSymbol *symbol)  { -    free(symbol->alt); +    if (symbol->alt != NULL) +        free(symbol->alt);      G_OBJECT_CLASS(g_binary_symbol_parent_class)->finalize(G_OBJECT(symbol)); @@ -192,7 +192,8 @@ static void g_binary_symbol_finalize(GBinSymbol *symbol)  /******************************************************************************  *                                                                             * -*  Paramètres  : type = type de symbole à créer.                              * +*  Paramètres  : range = espace couvert par le nouveau symbole.               * +*                type  = type de symbole à créer.                             *  *                                                                             *  *  Description : Crée un nouveau symbole d'exécutable.                        *  *                                                                             * @@ -202,13 +203,14 @@ static void g_binary_symbol_finalize(GBinSymbol *symbol)  *                                                                             *  ******************************************************************************/ -GBinSymbol *g_binary_symbol_new(SymbolType type) +GBinSymbol *g_binary_symbol_new(const mrange_t *range, SymbolType type)  {      GBinSymbol *result;                     /* Nouveau symbole à renvoyer  */      result = g_object_new(G_TYPE_BIN_SYMBOL, NULL); -    result->type = type; +    g_binary_symbol_set_range(result, range); +    g_binary_symbol_set_target_type(result, type);      return result; @@ -231,23 +233,8 @@ GBinSymbol *g_binary_symbol_new(SymbolType type)  int g_binary_symbol_cmp(const GBinSymbol * const *a, const GBinSymbol * const *b)  {      int result;                             /* Bilan à retourner           */ -	const mrange_t *ra;						/* Emplacement du symbole A	   */ -	const mrange_t *rb;						/* Emplacement du symbole B	   */ - -	ra = g_binary_symbol_get_range(*a); -	rb = g_binary_symbol_get_range(*b); -	if (ra == NULL && rb == NULL) -		result = 0; - -	else if (ra != NULL && rb == NULL) -		result = 1; - -	else if (ra == NULL && rb != NULL) -		result = -1; - -	else -        result = cmp_mrange(ra, rb); +    result = cmp_mrange(&(*a)->range, &(*b)->range);      return result; @@ -270,15 +257,8 @@ int g_binary_symbol_cmp(const GBinSymbol * const *a, const GBinSymbol * const *b  int g_binary_symbol_cmp_with_vmpa(const GBinSymbol *symbol, const vmpa2t *addr)  {      int result;                             /* Bilan à retourner           */ -    const mrange_t *range;                  /* Emplacement du symbole      */ - -    range = g_binary_symbol_get_range(symbol); -    if (range == NULL) -        result = 1; - -    else -        result = cmp_mrange_with_vmpa(range, addr); +    result = cmp_mrange_with_vmpa(&symbol->range, addr);      return result; @@ -287,69 +267,10 @@ int g_binary_symbol_cmp_with_vmpa(const GBinSymbol *symbol, const vmpa2t *addr)  /******************************************************************************  *                                                                             * -*  Paramètres  : symbol = symbole à venir consulter.                          * -*                                                                             * -*  Description : Fournit le type du symbole.                                  * -*                                                                             * -*  Retour      : Type de symbole représenté.                                  * -*                                                                             * -*  Remarques   : -                                                            * -*                                                                             * -******************************************************************************/ - -SymbolType g_binary_symbol_get_target_type(const GBinSymbol *symbol) -{ -    return symbol->type; - -} - - -/****************************************************************************** -*                                                                             * -*  Paramètres  : symbol = symbole à venir consulter.                          * +*  Paramètres  : symbol = symbole à mettre à jour.                            * +*                range  = plage mémoire ou physique déclarée.                 *  *                                                                             * -*  Description : Fournit un étiquette pour viser un symbole.                  * -*                                                                             * -*  Retour      : Chaîne de caractères renvoyant au symbole.                   * -*                                                                             * -*  Remarques   : -                                                            * -*                                                                             * -******************************************************************************/ - -const char *g_binary_symbol_get_label(const GBinSymbol *symbol) -{ -    const char *result;                     /* Etiquette à retourner       */ - -    if (symbol->alt != NULL) -        return symbol->alt; - -    result = NULL; - -    switch (symbol->type) -    { -        case STP_ROUTINE: -        case STP_ENTRY_POINT: -        case STP_CODE_LABEL: -            result = g_binary_routine_get_declarator(symbol->extra.routine, false); -            break; - -        default: -            result = NULL; -            break; - -    } - -    return result; - -} - - -/****************************************************************************** -*                                                                             * -*  Paramètres  : symbol = symbole à venir consulter.                          * -*                alt    = désignation humaine alternative à favoriser.        * -*                                                                             * -*  Description : Définit un autre nom pour le symbole.                        * +*  Description : Définit la couverture physique / en mémoire d'un symbole.    *  *                                                                             *  *  Retour      : -                                                            *  *                                                                             * @@ -357,15 +278,9 @@ const char *g_binary_symbol_get_label(const GBinSymbol *symbol)  *                                                                             *  ******************************************************************************/ -void g_binary_symbol_set_alt_label(GBinSymbol *symbol, const char *alt) +void g_binary_symbol_set_range(GBinSymbol *symbol, const mrange_t *range)  { -    if (symbol->alt != NULL) -        free(symbol->alt); - -    if (alt == NULL) -        symbol->alt = NULL; -    else -        symbol->alt = strdup(alt); +    copy_mrange(&symbol->range, range);  } @@ -384,42 +299,17 @@ void g_binary_symbol_set_alt_label(GBinSymbol *symbol, const char *alt)  const mrange_t *g_binary_symbol_get_range(const GBinSymbol *symbol)  { -    const mrange_t *result;                 /* Plage à retourner           */ - -    result = NULL; - -    switch (symbol->type) -    { -        case STP_DATA: -        case STP_RO_STRING: -            result = g_arch_instruction_get_range(symbol->extra.instr); -            break; - -        case STP_ROUTINE: -        case STP_ENTRY_POINT: -        case STP_CODE_LABEL: -            result = g_binary_routine_get_range(symbol->extra.routine); -            break; - -        default: -            /* FIXME : assert(0); */ -            result = NULL; -            break; - -    } - -    return result; +    return &symbol->range;  }  /******************************************************************************  *                                                                             * -*  Paramètres  : symbol  = symbole à venir consulter.                         * -*                routine = prototype de la fonction représentée.              * -*                type    = (nouveau) type du symbole attaché.                 * +*  Paramètres  : symbol = symbole à venir modifier.                           * +*                type   = type de symbole représenté.                         *  *                                                                             * -*  Description : Attache la routine associée au symbole.                      * +*  Description : Définit le type du symbole.                                  *  *                                                                             *  *  Retour      : -                                                            *  *                                                                             * @@ -427,83 +317,58 @@ const mrange_t *g_binary_symbol_get_range(const GBinSymbol *symbol)  *                                                                             *  ******************************************************************************/ -void _g_binary_symbol_attach_routine(GBinSymbol *symbol, GBinRoutine *routine, SymbolType type) +void g_binary_symbol_set_target_type(GBinSymbol *symbol, SymbolType type)  { -    if (symbol->extra.routine != NULL) -        g_object_unref(G_OBJECT(symbol->extra.routine)); -      symbol->type = type; -    symbol->extra.routine = routine; -  }  /******************************************************************************  *                                                                             * -*  Paramètres  : symbol  = symbole à venir consulter.                         * -*                routine = prototype de la fonction représentée.              * +*  Paramètres  : symbol = symbole à venir consulter.                          *  *                                                                             * -*  Description : Attache la routine associée au symbole.                      * +*  Description : Fournit le type du symbole.                                  *  *                                                                             * -*  Retour      : -                                                            * +*  Retour      : Type de symbole représenté.                                  *  *                                                                             *  *  Remarques   : -                                                            *  *                                                                             *  ******************************************************************************/ -void g_binary_symbol_attach_routine(GBinSymbol *symbol, GBinRoutine *routine) +SymbolType g_binary_symbol_get_target_type(const GBinSymbol *symbol)  { -    _g_binary_symbol_attach_routine(symbol, routine, symbol->type); +    return symbol->type;  }  /******************************************************************************  *                                                                             * -*  Paramètres  : symbol = symbole à venir manipuler.                          * -*                instr  = représentation du symbole associé.                  * +*  Paramètres  : symbol = symbole à venir consulter.                          *  *                                                                             * -*  Description : Attache l'instruction associée au symbole.                   * +*  Description : Fournit une étiquette pour viser un symbole.                 *  *                                                                             * -*  Retour      : -                                                            * +*  Retour      : Chaîne de caractères renvoyant au symbole.                   *  *                                                                             *  *  Remarques   : -                                                            *  *                                                                             *  ******************************************************************************/ -void g_binary_symbol_attach_instruction(GBinSymbol *symbol, GArchInstruction *instr) +const char *g_binary_symbol_get_label(GBinSymbol *symbol)  { -    if (symbol->type != STP_RO_STRING) -    symbol->type = STP_DATA; - -    symbol->extra.instr = instr; - -} - - -/****************************************************************************** -*                                                                             * -*  Paramètres  : symbol = symbole à venir consulter.                          * -*                                                                             * -*  Description : Fournit l'éventuelle routine associée au symbole.            * -*                                                                             * -*  Retour      : Instance GLib en place ou NULL si aucune.                    * -*                                                                             * -*  Remarques   : Il n'y a pas de transfert de propriété ici !                 * -*                                                                             * -******************************************************************************/ +    const char *result;                     /* Etiquette à retourner       */ -GBinRoutine *g_binary_symbol_get_routine(const GBinSymbol *symbol) -{ -    /* TODO : rajouter des assert() sur le type de symbole */ +    if (symbol->alt != NULL) +        result = symbol->alt; -    /* TODO : ref() */ +    else if (G_BIN_SYMBOL_GET_CLASS(symbol)->get_label != NULL) +        result = G_BIN_SYMBOL_GET_CLASS(symbol)->get_label(symbol); -    if (symbol->type != STP_ROUTINE && symbol->type != STP_ENTRY_POINT) -        return NULL; +    else +        result = NULL; -    return symbol->extra.routine; +    return result;  } @@ -511,22 +376,25 @@ GBinRoutine *g_binary_symbol_get_routine(const GBinSymbol *symbol)  /******************************************************************************  *                                                                             *  *  Paramètres  : symbol = symbole à venir consulter.                          * +*                alt    = désignation humaine alternative à favoriser.        *  *                                                                             * -*  Description : Fournit l'éventuelle instruction associée au symbole.        * +*  Description : Définit un autre nom pour le symbole.                        *  *                                                                             * -*  Retour      : Instance GLib en place ou NULL si aucune.                    * +*  Retour      : -                                                            *  *                                                                             * -*  Remarques   : Il n'y a pas de transfert de propriété ici !                 * +*  Remarques   : -                                                            *  *                                                                             *  ******************************************************************************/ -GArchInstruction *g_binary_symbol_get_instruction(const GBinSymbol *symbol) +void g_binary_symbol_set_alt_label(GBinSymbol *symbol, const char *alt)  { -    /* TODO : rajouter des assert() sur le type de symbole */ - -    /* TODO : ref() */ +    if (symbol->alt != NULL) +        free(symbol->alt); -    return symbol->extra.instr; +    if (alt == NULL) +        symbol->alt = NULL; +    else +        symbol->alt = strdup(alt);  } @@ -600,11 +468,7 @@ static size_t g_binary_symbol_count_lines(const GBinSymbol *symbol)  void g_binary_symbol_compute_addr(const GBinSymbol *symbol, gint x, vmpa2t *addr, size_t index, size_t repeat)  { -    const mrange_t *range;                  /* Emplacement à manipuler     */ - -    range = g_binary_symbol_get_range(symbol); - -    copy_vmpa(addr, get_mrange_addr(range)); +    copy_vmpa(addr, get_mrange_addr(&symbol->range));  } @@ -627,11 +491,8 @@ void g_binary_symbol_compute_addr(const GBinSymbol *symbol, gint x, vmpa2t *addr  static int g_binary_symbol_contains_addr(const GBinSymbol *symbol, const vmpa2t *addr, size_t index, size_t repeat)  {      int result;                             /* Conclusion à retourner      */ -    const mrange_t *range;                  /* Emplacement à manipuler     */ - -    range = g_binary_symbol_get_range(symbol); -    result = cmp_mrange_with_vmpa(range, addr); +    result = cmp_mrange_with_vmpa(&symbol->range, addr);      return result; @@ -677,12 +538,9 @@ static BufferLineFlags g_binary_symbol_get_flags(const GBinSymbol *symbol, size_  static void g_binary_symbol_print(GBinSymbol *symbol, GBufferLine *line, size_t index, size_t repeat, const GBinContent *content)  { -    const mrange_t *range;                  /* Emplacement à manipuler     */      const char *label;                      /* Etiquette à insérer         */ -    range = g_binary_symbol_get_range(symbol); - -    g_buffer_line_fill_vmpa(line, get_mrange_addr(range), MDS_32_BITS_UNSIGNED, MDS_32_BITS_UNSIGNED); +    g_buffer_line_fill_vmpa(line, get_mrange_addr(&symbol->range), MDS_32_BITS_UNSIGNED, MDS_32_BITS_UNSIGNED);      label = g_binary_symbol_get_label(symbol); diff --git a/src/format/symbol.h b/src/format/symbol.h index 0d40529..da51262 100644 --- a/src/format/symbol.h +++ b/src/format/symbol.h @@ -28,10 +28,6 @@  #include <glib-object.h> -#include "../analysis/routine.h" -#include "../analysis/db/item.h" -#include "../analysis/db/items/comment.h" -#include "../arch/instruction.h"  #include "../glibext/linegen.h" @@ -55,10 +51,6 @@ typedef enum _SymbolType  } SymbolType; -#define HAS_DATA_INSTR(type) (type == STP_DATA || type == STP_RO_STRING) - - -  #define G_TYPE_BIN_SYMBOL               g_binary_symbol_get_type()  #define G_BIN_SYMBOL(obj)               (G_TYPE_CHECK_INSTANCE_CAST((obj), g_binary_symbol_get_type(), GBinSymbol))  #define G_IS_BIN_SYMBOL(obj)            (G_TYPE_CHECK_INSTANCE_TYPE((obj), g_binary_symbol_get_type())) @@ -78,7 +70,7 @@ typedef struct _GBinSymbolClass GBinSymbolClass;  GType g_binary_symbol_get_type(void);  /* Crée un nouveau symbole d'exécutable. */ -GBinSymbol *g_binary_symbol_new(SymbolType); +GBinSymbol *g_binary_symbol_new(const mrange_t *, SymbolType);  /* Compare deux symboles d'exécutable selon leurs propriétés. */  int g_binary_symbol_cmp(const GBinSymbol * const *, const GBinSymbol * const *); @@ -86,49 +78,23 @@ int g_binary_symbol_cmp(const GBinSymbol * const *, const GBinSymbol * const *);  /* Compare un symbole et une localisation. */  int g_binary_symbol_cmp_with_vmpa(const GBinSymbol *, const vmpa2t *); -/* Fournit le type du symbole. */ -SymbolType g_binary_symbol_get_target_type(const GBinSymbol *); - -/* Fournit un étiquette pour viser un symbole. */ -const char *g_binary_symbol_get_label(const GBinSymbol *); - -/* Définit un autre nom pour le symbole. */ -void g_binary_symbol_set_alt_label(GBinSymbol *, const char *); +/* Définit la couverture physique / en mémoire d'un symbole. */ +void g_binary_symbol_set_range(GBinSymbol *, const mrange_t *);  /* Fournit l'emplacement où se situe un symbole. */  const mrange_t *g_binary_symbol_get_range(const GBinSymbol *); -/* Attache la routine associée au symbole. */ -void _g_binary_symbol_attach_routine(GBinSymbol *, GBinRoutine *, SymbolType); - -/* Attache la routine associée au symbole. */ -void g_binary_symbol_attach_routine(GBinSymbol *, GBinRoutine *); - -/* Attache l'instruction associée au symbole. */ -void g_binary_symbol_attach_instruction(GBinSymbol *, GArchInstruction *); - -/* Fournit l'éventuelle routine associée au symbole. */ -GBinRoutine *g_binary_symbol_get_routine(const GBinSymbol *); - -/* Fournit l'éventuelle instruction associée au symbole. */ -GArchInstruction *g_binary_symbol_get_instruction(const GBinSymbol *); - - -/** - * Confort pour l'ajout de symboles basés sur des formats. - */ - +/* Définit le type du symbole. */ +void g_binary_symbol_set_target_type(GBinSymbol *, SymbolType); +/* Fournit le type du symbole. */ +SymbolType g_binary_symbol_get_target_type(const GBinSymbol *); +/* Fournit une étiquette pour viser un symbole. */ +const char *g_binary_symbol_get_label(GBinSymbol *); -#define ADD_STR_AS_SYM(_fmt, _sym, _ins)                                    \ -    ({                                                                      \ -        bool __result;                                                      \ -        _sym = g_binary_symbol_new(STP_RO_STRING);                          \ -        g_binary_symbol_attach_instruction(_sym, _ins);                     \ -        __result = g_binary_format_add_symbol(G_BIN_FORMAT(_fmt), _sym);    \ -        __result;                                                           \ -    }) +/* Définit un autre nom pour le symbole. */ +void g_binary_symbol_set_alt_label(GBinSymbol *, const char *);  | 
