diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2018-11-24 14:28:22 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2018-11-24 14:28:22 (GMT) |
commit | dd851e1fb743d77b421519ee5915534aed2d2c4f (patch) | |
tree | 9a9f91c09438467ade7a67c5e2188b4051d23569 /plugins/dwarf/die.c | |
parent | 59b1bdfdc9b64dac8fd1450c51aa5014c8c469f0 (diff) |
Updated the DWARF support.
Diffstat (limited to 'plugins/dwarf/die.c')
-rw-r--r-- | plugins/dwarf/die.c | 241 |
1 files changed, 45 insertions, 196 deletions
diff --git a/plugins/dwarf/die.c b/plugins/dwarf/die.c index 0c1887c..0a8cbec 100644 --- a/plugins/dwarf/die.c +++ b/plugins/dwarf/die.c @@ -2,7 +2,7 @@ /* Chrysalide - Outil d'analyse de fichiers binaires * die.c - gestion des entrées renvoyant à des informations de débogage * - * Copyright (C) 2016-2017 Cyrille Bagard + * Copyright (C) 2016-2018 Cyrille Bagard * * This file is part of Chrysalide. * @@ -24,13 +24,6 @@ #include "die.h" -#include <assert.h> -#include <malloc.h> - - -#include "dwarf-int.h" - - /** * § 2.1 The Debugging Information Entry (DIE). @@ -38,14 +31,9 @@ typedef struct _dw_die { - unsigned int level; /* Niveau hiérarchique */ - phys_t offset; /* Position dans le flux */ - - const dw_abbrev *abbrev; /* Lien vers la représentation */ - dw_value *values; /* Liste des valeurs associées */ + size_t values_count; /* Taille de cette liste */ - bool has_children; /* Feuille ou noeud de l'arbre */ struct _dw_die **children; /* Liste d'éventuels enfants */ size_t children_count; /* Taille de cette liste */ @@ -55,13 +43,13 @@ typedef struct _dw_die /****************************************************************************** * * -* Paramètres : format = informations chargées à consulter. * -* pos = position de début de lecture. [OUT] * -* endian = boutisme reconnu dans le format. * -* header = en-tête de description de l'unité à traiter. * -* die = emplacement de stockage de l'entrée ou NULL. [OUT] * +* Paramètres : format = informations chargées à consulter. * +* content = contenu encadré à parcourir. * +* pos = position de début de lecture. [OUT] * +* cu = en-tête de description de l'unité à traiter. * +* die = emplacement de stockage de l'entrée ou NULL. [OUT] * * * -* Description : Procède à la lecture de l'en-tête d'une unité de compilation.* +* Description : Procède à la lecture d'un élément d'information de débogage. * * * * Retour : Bilan de l'opération. * * * @@ -69,50 +57,67 @@ typedef struct _dw_die * * ******************************************************************************/ -bool build_dwarf_die(GDwarfFormat *format, vmpa2t *pos, SourceEndian endian, const dw_compil_unit_header *header, dw_die **die) +bool build_dwarf_die(GDwarfFormat *format, GBinContent *content, vmpa2t *pos, const dw_compil_unit_header *cu, const dw_abbrev_brotherhood *abbrevs, dw_die **die) { + bool result; /* Bilan à retourner */ uleb128_t code; /* Code de la description liée */ bool status; /* Bilan de la lecture */ const dw_abbrev *abbrev; /* Lien vers la représentation */ dw_value *values; /* Liste des valeurs associées */ + dw_die *child; /* Sous-élément à intégrer */ - *die = NULL; + result = false; /** * § 7.5.2 Debugging Information Entry. */ - status = g_binary_content_read_uleb128(G_BIN_FORMAT(format)->content, pos, &code); - if (!status) return false; + status = g_binary_content_read_uleb128(content, pos, &code); + if (!status) goto exit; - printf("[ok] code = 0x%llx\n", (unsigned long long)code); + if (code == 0) + { + *die = NULL; + goto end_of_sibling; + } - if (code == 0) return true; + abbrev = find_dwarf_abbreviation(abbrevs, code); + if (abbrev == NULL) goto exit; - abbrev = find_dwarf_abbreviations(format, code); + values = translate_abbrev_attribs(abbrev, format, content, pos, cu); + if (values == NULL) goto exit; - printf("[ok] abbrev = %p\n", abbrev); + *die = calloc(1, sizeof(dw_die)); - printf("----------------------\n"); - - - values = translate_abbreviation_attributes(format, abbrev, header, pos); - if (values == NULL) return false; + (*die)->values = values; + (*die)->values_count = dwarf_abbreviation_count_attribs(abbrev); - printf("[ok] values = %p\n", values); + if (has_abbrev_children(abbrev)) + while (true) + { + status = build_dwarf_die(format, content, pos, cu, abbrevs, &child); + if (!status) + { + delete_dwarf_die(*die); + goto exit; + } + if (child == NULL) + break; - *die = (dw_die *)calloc(1, sizeof(dw_die)); + (*die)->children = realloc((*die)->children, ++(*die)->children_count * sizeof(dw_die *)); + (*die)->children[(*die)->children_count - 1] = child; - (*die)->abbrev = abbrev; + } - (*die)->values = values; + end_of_sibling: - (*die)->has_children = dwarf_abbreviation_has_children(abbrev); + result = true; + exit: - return true; + return result; } @@ -134,7 +139,7 @@ void delete_dwarf_die(dw_die *die) size_t i; /* Boucle de parcours */ if (die->values != NULL) - free(die->values); + free_abbrev_attribs(die->values, die->values_count); for (i = 0; i < die->children_count; i++) delete_dwarf_die(die->children[i]); @@ -145,159 +150,3 @@ void delete_dwarf_die(dw_die *die) free(die); } - - -/****************************************************************************** -* * -* Paramètres : die = entrée à consulter. * -* * -* Description : Fournit un lien vers l'abréviation de représentation. * -* * -* Retour : Structure de représentation en place. * -* * -* Remarques : - * -* * -******************************************************************************/ - -const dw_abbrev *dw_die_get_abbrev(const dw_die *die) -{ - return die->abbrev; - -} - - -/****************************************************************************** -* * -* Paramètres : die = entrée à consulter. * -* index = indice de cet attribut dans l'ensemble. * -* * -* Description : Fournit un lien vers l'abréviation de représentation. * -* * -* Retour : Valeur recherchée ou NULL en cas d'erreur. * -* * -* Remarques : - * -* * -******************************************************************************/ - -const dw_form_value *dw_die_peek_value(const dw_die *die, size_t index) -{ - dw_form_value *result; /* Valeur ciblée à retourner */ - - if (index >= dwarf_abbreviation_count_attribs(die->abbrev)) - return NULL; - - result = &die->values[index].value; - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : die = entrée d'information à consulter. * -* attrib = désignation de l'attribut à retrouver. * -* form = type de valeur attendu pour un attribut donné. [OUT]* -* * -* Description : Fournit un lien vers l'abréviation de représentation. * -* * -* Retour : Valeur recherchée ou NULL en cas d'erreur. * -* * -* Remarques : - * -* * -******************************************************************************/ - -const dw_form_value *dw_die_peek_extended_value(const dw_die *die, DwarfAttrib attrib, DwarfForm *form) -{ - const dw_form_value *result; /* Valeur ciblée à retourner */ - size_t index; /* Indice d'élément à relire */ - bool status; /* Bilan d'une récupération */ - - status = dwarf_abbreviation_get_attrib_index(die->abbrev, attrib, &index); - if (!status) return NULL; - - status = dwarf_abbreviation_get_form_for_index(die->abbrev, index, form); - if (!status) return NULL; - - result = dw_die_peek_value(die, index); - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : die = entrée à consulter. * -* * -* Description : Indique si une entrée de débogage possède des enfants. * -* * -* Retour : true ou false selon la situation. * -* * -* Remarques : - * -* * -******************************************************************************/ - -bool dw_die_has_children(const dw_die *die) -{ - return die->has_children; - -} - - -/****************************************************************************** -* * -* Paramètres : die = entrée à consulter. * -* * -* Description : Indique si une entrée de débogage possède des enfants. * -* * -* Retour : true ou false selon la situation. * -* * -* Remarques : - * -* * -******************************************************************************/ - -void dw_die_append_child(dw_die *die, dw_die *child) -{ - assert(die->has_children); - - die->children = (dw_die **)realloc(die->children, ++die->children_count * sizeof(dw_die *)); - - die->children[die->children_count - 1] = child; - -} - - - -/* ---------------------------------------------------------------------------------- */ -/* TRAITEMENT PAR ENSEMBLES */ -/* ---------------------------------------------------------------------------------- */ - - -/****************************************************************************** -* * -* Paramètres : root = entrée première à consulter. * -* visitor = intervention régulière à respecter. * -* data = données quelconques à associer aux visites. * -* * -* Description : Entame une grande tournée de toutes les entrées présentes. * -* * -* Retour : true si l'opération s'est déroulée complètement, false sinon.* -* * -* Remarques : - * -* * -******************************************************************************/ - -bool dw_die_visit(dw_die *root, visit_dies_fc visitor, void *data) -{ - bool result; /* Bilan à retourner */ - size_t i; /* Boucle de parcours */ - - result = visitor(root, data); - - for (i = 0; i < root->children_count && result; i++) - result = dw_die_visit(root->children[i], visitor, data); - - return result; - -} |