diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/common/array.c | 81 | ||||
-rw-r--r-- | src/common/array.h | 6 | ||||
-rwxr-xr-x | src/format/dex/dex.c | 3 | ||||
-rw-r--r-- | src/format/elf/elf.c | 13 | ||||
-rw-r--r-- | src/format/elf/strings.c | 14 | ||||
-rw-r--r-- | src/format/format-int.h | 3 | ||||
-rw-r--r-- | src/format/format.c | 17 | ||||
-rw-r--r-- | src/format/preload.c | 29 | ||||
-rw-r--r-- | src/format/preload.h | 3 |
9 files changed, 158 insertions, 11 deletions
diff --git a/src/common/array.c b/src/common/array.c index f520d1d..dcb9344 100644 --- a/src/common/array.c +++ b/src/common/array.c @@ -215,6 +215,87 @@ void reset_flat_array(flat_array_t **array) /****************************************************************************** * * +* Paramètres : src = tableau compressé à consulter. * +* dest = tableau compressé à constituer. [OUT] * +* size = taille de ce nouvel élément. * +* notify = éventuelle fonction à appeler sur chaque élément. * +* * +* Description : Copie le contenu d'un tableau d'éléments dans un autre. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void copy_flat_array_items(flat_array_t **src, flat_array_t **dest, size_t size, item_notify_cb notify) +{ + void *item; /* Elément manipulé */ + ext_flat_array_t *extended; /* Version de tableau étendue */ + ext_flat_array_t *new; /* Nouvelle copie créée */ + size_t i; /* Boucle de parcours */ + + assert(!FLAT_ARRAY_IS_LOCKED(*src)); + assert(!FLAT_ARRAY_IS_LOCKED(*dest)); + + lock_flat_array(src); + lock_flat_array(dest); + + assert(FLAT_ARRAY_IS_EMPTY(*dest)); + + if (FLAT_ARRAY_IS_EMPTY(*src)) + goto cfai_done; + + if (FLAT_ARRAY_HAS_NO_INDEX(*src)) + { + item = GET_LONELY_ITEM(*src); + + if (notify != NULL) + notify(item); + + *dest = malloc(size); + memcpy(*dest, item, size); + + lock_flat_array(dest); + + } + + else + { + extended = EXTENDED_ARRAY(*src); + + new = (ext_flat_array_t *)malloc(sizeof(ext_flat_array_t)); + + new->items = malloc(extended->count * size); + new->count = extended->count; + + memcpy(new->items, extended->items, new->count * size); + + if (notify != NULL) + for (i = 0; i < new->count; i++) + { + item = (void *)(((char *)new->items) + i * size); + notify(item); + } + + FLAT_ARRAY_SET_INDEX(new); + + *dest = (flat_array_t *)new; + + lock_flat_array(dest); + + } + + cfai_done: + + unlock_flat_array(src); + unlock_flat_array(dest); + +} + + +/****************************************************************************** +* * * Paramètres : array = tableau compressé à consulter. * * * * Description : Indique la quantité d'éléments présents dans le tableau. * diff --git a/src/common/array.h b/src/common/array.h index bdb1ae4..546de1a 100644 --- a/src/common/array.h +++ b/src/common/array.h @@ -33,6 +33,9 @@ /* Type déclaratif de tableau compressé, à 0 ou 1 élément */ typedef void *flat_array_t; +/* Parcours d'éléments */ +typedef void (* item_notify_cb) (void *); + /* Verrouille l'accès à un tableau compressé. */ void lock_flat_array(flat_array_t **); @@ -43,6 +46,9 @@ void unlock_flat_array(flat_array_t **); /* Réinitialise un tableau sans traitement excessif. */ void reset_flat_array(flat_array_t **); +/* Copie le contenu d'un tableau d'éléments dans un autre. */ +void copy_flat_array_items(flat_array_t **, flat_array_t **, size_t, item_notify_cb); + /* Indique la quantité d'éléments présents dans le tableau. */ size_t count_flat_array_items(const flat_array_t *); diff --git a/src/format/dex/dex.c b/src/format/dex/dex.c index e34318f..b0b32a7 100755 --- a/src/format/dex/dex.c +++ b/src/format/dex/dex.c @@ -32,6 +32,7 @@ #include "dex-int.h" #include "pool.h" +#include "../../plugins/pglist.h" @@ -287,6 +288,8 @@ GBinFormat *g_dex_format_new(GBinContent *content, GExeFormat *parent, GtkStatus if (!load_all_dex_classes(result, gid, status)) goto gdfn_error; + preload_binary_format(PGA_FORMAT_PRELOAD, base, base->info, status); + if (!g_executable_format_complete_loading(exe_format, status)) goto gdfn_error; diff --git a/src/format/elf/elf.c b/src/format/elf/elf.c index bc48eb5..0336ba3 100644 --- a/src/format/elf/elf.c +++ b/src/format/elf/elf.c @@ -39,6 +39,7 @@ #include "strings.h" #include "symbols.h" #include "../../gui/panels/log.h" +#include "../../plugins/pglist.h" @@ -293,6 +294,18 @@ GBinFormat *g_elf_format_new(GBinContent *content, GExeFormat *parent, GtkStatus + /** + * On inscrit les éléments préchargés avant tout ! + * + * Cela permet de partir d'une base vide, et d'ajouter les instructions et + * leurs commentaires par paires. + * + * Ensuite, on inscrit le reste (comme les chaînes de caractères). + */ + + preload_binary_format(PGA_FORMAT_PRELOAD, base, base->info, status); + + if (!load_elf_symbols(result, status)) { /* TODO */ diff --git a/src/format/elf/strings.c b/src/format/elf/strings.c index 8901db9..d350200 100644 --- a/src/format/elf/strings.c +++ b/src/format/elf/strings.c @@ -37,7 +37,7 @@ /* Enregistre toutes les chaînes de caractères trouvées. */ -bool parse_elf_string_data(GElfFormat *, phys_t, phys_t, virt_t); +static bool parse_elf_string_data(GElfFormat *, phys_t, phys_t, virt_t); @@ -148,9 +148,10 @@ bool find_all_elf_strings(GElfFormat *format) * * ******************************************************************************/ -bool parse_elf_string_data(GElfFormat *format, phys_t start, phys_t size, virt_t address) +static bool parse_elf_string_data(GElfFormat *format, phys_t start, phys_t size, virt_t address) { bool result; /* Bilan à faire remonter */ + GBinFormat *base; /* Autre version du format */ GBinContent *content; /* Contenu binaire à lire */ const bin_t *data; /* Contenu complet et original */ vmpa2t pos; /* Tête de lecture */ @@ -168,7 +169,9 @@ bool parse_elf_string_data(GElfFormat *format, phys_t start, phys_t size, virt_t /* Préparation des accès */ - content = g_binary_format_get_content(G_BIN_FORMAT(format)); + base = G_BIN_FORMAT(format); + + content = g_binary_format_get_content(base); init_vmpa(&pos, start, address); @@ -199,6 +202,9 @@ bool parse_elf_string_data(GElfFormat *format, phys_t start, phys_t size, virt_t g_raw_instruction_mark_as_string(G_RAW_INSTRUCTION(instr), true); + g_preload_info_add_instruction(base->info, instr); + + g_object_ref(G_OBJECT(instr)); ADD_STR_AS_SYM(format, symbol, instr); /* Jointure avec la chaîne précédente ? */ @@ -207,7 +213,7 @@ bool parse_elf_string_data(GElfFormat *format, phys_t start, phys_t size, virt_t { init_vmpa(&pos, start + i, address + i); - label = create_string_label(G_BIN_FORMAT(format), &pos, end - i); + label = create_string_label(base, &pos, end - i); g_binary_symbol_set_alt_label(symbol, label); diff --git a/src/format/format-int.h b/src/format/format-int.h index f82190f..30fb666 100644 --- a/src/format/format-int.h +++ b/src/format/format-int.h @@ -28,6 +28,7 @@ #include "format.h" +#include "preload.h" #include "../gtkext/gtkstatusstack.h" @@ -62,6 +63,8 @@ struct _GBinFormat GRWLock pt_lock; /* Accès à la liste des points */ + GPreloadInfo *info; /* Préchargements du format */ + GBinSymbol **symbols; /* Liste des symboles trouvés */ size_t symbols_count; /* Quantité de ces symboles */ GRWLock syms_lock; /* Accès à la liste de symboles*/ diff --git a/src/format/format.c b/src/format/format.c index 1eef759..d5cbda4 100644 --- a/src/format/format.c +++ b/src/format/format.c @@ -99,11 +99,20 @@ static void g_binary_format_init(GBinFormat *format) { g_rw_lock_init(&format->pt_lock); + format->info = g_preload_info_new(); + g_rw_lock_init(&format->syms_lock); } + +/* FIXME : g_object_unref(format->info); */ + +/* FIXME : g_rw_lock_clear(&format->syms_lock);*/ + + + /****************************************************************************** * * * Paramètres : format = instance à traiter. * @@ -128,12 +137,6 @@ bool g_binary_format_complete_loading(GBinFormat *format, GtkStatusStack *status } - - -/* FIXME : g_rw_lock_clear(&format->syms_lock);*/ - - - /****************************************************************************** * * * Paramètres : format = description de l'exécutable à consulter. * @@ -260,7 +263,7 @@ void g_binary_format_register_code_point(GBinFormat *format, virt_t pt, bool ent void g_binary_format_preload_disassembling_context(GBinFormat *format, GProcContext *ctx, GtkStatusStack *status) { - preload_binary_format(PGA_FORMAT_PRELOAD, format, G_PRELOAD_INFO(ctx), status); + g_preload_info_copy(format->info, G_PRELOAD_INFO(ctx)); } diff --git a/src/format/preload.c b/src/format/preload.c index 750a67c..2eec92e 100644 --- a/src/format/preload.c +++ b/src/format/preload.c @@ -181,6 +181,35 @@ GPreloadInfo *g_preload_info_new(void) /****************************************************************************** * * +* Paramètres : src = collecte à consulter. * +* dest = collecte à constituer. [OUT] * +* * +* Description : Copie le contenu d'une collecte d'informations préchargées. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void g_preload_info_copy(GPreloadInfo *src, GPreloadInfo *dest) +{ + void inc_preloaded_item_ref(GObject **item) + { + g_object_ref(*item); + } + + copy_flat_array_items(&src->instructions, &dest->instructions, + sizeof(GArchInstruction *), (item_notify_cb)inc_preloaded_item_ref); + + copy_flat_array_items(&src->comments, &dest->comments, + sizeof(GDbComment *), (item_notify_cb)inc_preloaded_item_ref); + +} + + +/****************************************************************************** +* * * Paramètres : info = préchargements à mettre à jour. * * * * Description : Verrouille les accès à la liste des instructions. * diff --git a/src/format/preload.h b/src/format/preload.h index d88366a..59c81b7 100644 --- a/src/format/preload.h +++ b/src/format/preload.h @@ -54,6 +54,9 @@ GType g_preload_info_get_type(void); /* Crée une nouvelle collecte d'informations préchargées. */ GPreloadInfo *g_preload_info_new(void); +/* Copie le contenu d'une collecte d'informations préchargées. */ +void g_preload_info_copy(GPreloadInfo *, GPreloadInfo *); + /* Verrouille les accès à la liste des instructions. */ void g_preload_info_lock_instructions(GPreloadInfo *); |