diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2016-05-19 21:21:30 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2016-05-19 21:21:30 (GMT) |
commit | f828d126a74facac145531822c6ea9c8259b50e0 (patch) | |
tree | 521bfa44de551f30934ee321339a7a87d12a3243 /src/format/elf/loading.c | |
parent | e92c777c91612c8508d263645480c6c3889b679d (diff) |
Loaded the ELF internal symbols using all the available CPUs.
Diffstat (limited to 'src/format/elf/loading.c')
-rw-r--r-- | src/format/elf/loading.c | 291 |
1 files changed, 291 insertions, 0 deletions
diff --git a/src/format/elf/loading.c b/src/format/elf/loading.c new file mode 100644 index 0000000..b833720 --- /dev/null +++ b/src/format/elf/loading.c @@ -0,0 +1,291 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * loading.c - chargements parallèles des symboles de format ELF + * + * Copyright (C) 2016 Cyrille Bagard + * + * This file is part of Chrysalide. + * + * OpenIDA is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * OpenIDA is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Foobar. If not, see <http://www.gnu.org/licenses/>. + */ + + +#include "loading.h" + + +#include <i18n.h> + + +#include "elf-int.h" +#include "section.h" +#include "../../glibext/delayed-int.h" +#include "../../gui/panels/log.h" + + + +/* Fraction de routines à limiter (instance) */ +struct _GElfLoading +{ + GDelayedWork parent; /* A laisser en premier */ + + GElfFormat *format; /* Format à faire évoluer */ + + union + { + struct + { + const elf_shdr *section; /* Section à éplucher */ + bool use_virt; /* Représentatio par défaut */ + + elf_shdr strtab; /* Section .strtab trouvée */ + bool has_strtab; /* Présence de cette section */ + + }; + + }; + + elf_loading_cb callback; /* Routine de traitement finale*/ + phys_t first; /* Position du premier élément */ + phys_t begin; /* Point de départ du parcours */ + phys_t end; /* Point d'arrivée exclu */ + + activity_id_t id; /* Identifiant pour messages */ + +}; + +/* Fraction de routines à limiter (classe) */ +struct _GElfLoadingClass +{ + GDelayedWorkClass parent; /* A laisser en premier */ + +}; + + +/* Initialise la classe des tâches des chargements pour ELF. */ +static void g_elf_loading_class_init(GElfLoadingClass *); + +/* Initialise une tâche de chargements pour ELF. */ +static void g_elf_loading_init(GElfLoading *); + +/* Supprime toutes les références externes. */ +static void g_elf_loading_dispose(GElfLoading *); + +/* Procède à la libération totale de la mémoire. */ +static void g_elf_loading_finalize(GElfLoading *); + +/* Assure le chargement pour un format ELF en différé. */ +static void g_elf_loading_process(GElfLoading *, GtkStatusStack *); + + + +/* Indique le type défini pour les tâches de chargements pour format ELF. */ +G_DEFINE_TYPE(GElfLoading, g_elf_loading, G_TYPE_DELAYED_WORK); + + +/****************************************************************************** +* * +* Paramètres : klass = classe à initialiser. * +* * +* Description : Initialise la classe des tâches des chargements pour ELF. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_elf_loading_class_init(GElfLoadingClass *klass) +{ + GObjectClass *object; /* Autre version de la classe */ + GDelayedWorkClass *work; /* Version en classe parente */ + + object = G_OBJECT_CLASS(klass); + + object->dispose = (GObjectFinalizeFunc/* ! */)g_elf_loading_dispose; + object->finalize = (GObjectFinalizeFunc)g_elf_loading_finalize; + + work = G_DELAYED_WORK_CLASS(klass); + + work->run = (run_task_fc)g_elf_loading_process; + +} + + +/****************************************************************************** +* * +* Paramètres : loading = instance à initialiser. * +* * +* Description : Initialise une tâche de chargements pour ELF. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_elf_loading_init(GElfLoading *loading) +{ + +} + + +/****************************************************************************** +* * +* Paramètres : loading = instance d'objet GLib à traiter. * +* * +* Description : Supprime toutes les références externes. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_elf_loading_dispose(GElfLoading *loading) +{ + G_OBJECT_CLASS(g_elf_loading_parent_class)->dispose(G_OBJECT(loading)); + +} + + +/****************************************************************************** +* * +* Paramètres : loading = instance d'objet GLib à traiter. * +* * +* Description : Procède à la libération totale de la mémoire. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_elf_loading_finalize(GElfLoading *loading) +{ + G_OBJECT_CLASS(g_elf_loading_parent_class)->finalize(G_OBJECT(loading)); + +} + + +/****************************************************************************** +* * +* Paramètres : format = = ensemble d'instructions désassemblées. * +* section = prototypes existants à insérer. * +* use_virt = quantité de ces prototypes. * +* first = position du premier élément. * +* begin = point de départ du parcours de liste. * +* end = point d'arrivée exclu du parcours. * +* id = identifiant du message affiché à l'utilisateur. * +* callback = routine de traitements particuliers. * +* * +* Description : Crée une tâche de chargement pour ELF différée. * +* * +* Retour : Tâche créée. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GElfLoading *g_elf_loading_new(GElfFormat *format, const elf_shdr *section, bool use_virt, phys_t first, phys_t begin, phys_t end, activity_id_t id, elf_loading_cb callback) +{ + GElfLoading *result; /* Tâche à retourner */ + + result = g_object_new(G_TYPE_ELF_LOADING, NULL); + + result->format = format; + + result->section = section; + result->use_virt = use_virt; + + result->has_strtab = find_elf_section_by_index(format, + ELF_SHDR(format, *section, sh_link), + &result->strtab); + + result->callback = callback; + result->first = first; + result->begin = begin; + result->end = end; + + result->id = id; + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : study = étude de routines à mener. * +* status = barre de statut à tenir informée. * +* * +* Description : Assure le chargement pour un format ELF en différé. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_elf_loading_process(GElfLoading *loading, GtkStatusStack *status) +{ + phys_t iter; /* Boucle de parcours */ + phys_t old; /* Sauvegarde du point d'avant */ + bool ret; /* Bilan d'un appel */ + + for (iter = loading->begin; iter < loading->end; ) + { + old = iter; + ret = loading->callback(loading, loading->format, &iter); + + if (!ret) + { + log_variadic_message(LMT_ERROR, _("Error while loading ELF data @ 0x%08x!"), old); + break; + } + + gtk_status_stack_update_activity_value(status, loading->id, 1); + + } + +} + + +/****************************************************************************** +* * +* Paramètres : loading = chargement pour ELF à mener. * +* section = prototypes existants à insérer. [OUT] * +* use_virt = quantité de ces prototypes. [OUT] * +* strtab = informations quant à la table des chaînes. [OUT]* +* has_strtab = validité du champ précédemment renseigné. [OUT] * +* first = position du premier élément. [OUT] * +* * +* Description : Fournit les infos utiles au chargement de symbols internes. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void g_elf_loading_get_internal_info(GElfLoading *loading, const elf_shdr **section, bool *use_virt, const elf_shdr **strtab, bool *has_strtab, phys_t *first) +{ + *section = loading->section; + *use_virt = loading->use_virt; + + *strtab = &loading->strtab; + *has_strtab = loading->has_strtab; + + *first = loading->first; + +} |