diff options
-rw-r--r-- | ChangeLog | 13 | ||||
-rw-r--r-- | src/binary.c | 94 | ||||
-rw-r--r-- | src/format/dwarf/d_dwarf.c | 36 | ||||
-rw-r--r-- | src/format/dwarf/d_dwarf.h | 2 | ||||
-rw-r--r-- | src/gtksnippet.c | 84 | ||||
-rw-r--r-- | src/gtksnippet.h | 29 |
6 files changed, 189 insertions, 69 deletions
@@ -1,5 +1,18 @@ 2008-08-24 Cyrille Bagard <nocbos@gmail.com> + * src/binary.c: + Remove unused code. Get and insert comments into code. + + * src/format/dwarf/d_dwarf.c: + * src/format/dwarf/d_dwarf.h: + Provide comments for all registered debug functions. + + * src/gtksnippet.c: + * src/gtksnippet.h: + Better handle the code lines. + +2008-08-24 Cyrille Bagard <nocbos@gmail.com> + * src/format/dwarf/abbrev.c: * src/format/dwarf/abbrev.h: Remove old code. Add a function to test if an attribute exists. diff --git a/src/binary.c b/src/binary.c index 4938b0f..862a4d0 100644 --- a/src/binary.c +++ b/src/binary.c @@ -123,9 +123,16 @@ void fill_snippet(GtkSnippet *snippet) asm_processor *proc; asm_instr *instr; - uint8_t *data = "\x66\xba\x0c\x00\x00\x00\x66\xb9\x28\x00\xee\x00\x66\xbb\x01\x00\x00\x00\x66\xb8\x04\x00\x00\x00\xcd\x80\x66\xbb\x00\x00\x00\x00\x66\xb8\x01\x00\x00\x00\xcd\x80\x48\x65\x6c\x6c\x6f\x20\x57\x6f\x72\x6c\x64\x0a"; + char **comments; + uint64_t *offsets; + size_t comments_count; + code_line_info **comments_list; - //uint8_t *data = "\x66\xbb\x00\x00\x00\x00\x66\xb8\x01\x00\x00\x00\xcd\x80\x90"; + + + code_line_info **list; + size_t list_len; + code_line_info *item; off_t start; off_t pos; @@ -136,6 +143,8 @@ void fill_snippet(GtkSnippet *snippet) uint64_t base = 0; uint64_t offset = 0; + size_t i; + proc = create_x86_processor(); pos = 0; @@ -154,16 +163,27 @@ void fill_snippet(GtkSnippet *snippet) format = load_elf(bin_data, length); dformat = load_dwarf(bin_data, length, format); + + + comments_count = get_dwarf_comments(dformat, &comments, &offsets); + + comments_list = (code_line_info **)calloc(comments_count, sizeof(code_line_info *)); + + for (i = 0; i < comments_count; i++) + comments_list[i] = create_code_line_info(offsets[i], NULL, strdup(comments[i])); + + i = 0; + find_exe_section(format, ".text", &pos, &len, &base); /*find_line_info(bin_data, &len);*/ - + /* printf("Exiting...\n"); exit(0); - + */ offset = base; @@ -171,77 +191,49 @@ void fill_snippet(GtkSnippet *snippet) gtk_snippet_set_processor(snippet, proc); - gtk_snippet_add_line(snippet, offset, NULL, "Simple HelloWorld !"); + gtk_snippet_add_line(snippet, create_code_line_info(offset, NULL, "Simple HelloWorld !")); -#if 1 start = pos; pos = 0; - while (pos < len) - { - offset = base + pos; - - instr = decode_instruction(proc, &bin_data[start], &pos, len, offset); - - gtk_snippet_add_line(snippet, offset, instr, NULL); - - - } - - - ret = munmap(bin_data, length); - - -#else - - pos = 0; - len = 0x28; - + list = NULL; + list_len = 0; while (pos < len) { offset = base + pos; - instr = decode_instruction(proc, data, &pos, len, offset); - - gtk_snippet_add_line(snippet, offset, instr, NULL); + /* Si on a un commentaire pour cette ligne... */ + if (comments_count > 0 && offsets[i] == offset) + { + list = (code_line_info **)realloc(list, ++list_len * sizeof(code_line_info *)); + list[list_len - 1] = comments_list[i++]; + } - } + instr = decode_instruction(proc, &bin_data[start], &pos, len, offset); - gtk_snippet_add_line(snippet, offset, NULL, "Simple HelloWorld !"); + item = create_code_line_info(offset, instr, NULL); - pos = 0; - while (pos < len) - { - offset = base + pos; + list = (code_line_info **)realloc(list, ++list_len * sizeof(code_line_info *)); + list[list_len - 1] = item; - instr = decode_instruction(proc, data, &pos, len, offset); - - gtk_snippet_add_line(snippet, offset, instr, NULL); + //gtk_snippet_add_line(snippet, offset, instr, NULL); } - - gtk_snippet_add_line(snippet, offset, NULL, "Simple HelloWorld !"); - - pos = 0; - while (pos < len) + for (i = 0; i < list_len; i++) { - offset = base + pos; - - instr = decode_instruction(proc, data, &pos, len, offset); - - gtk_snippet_add_line(snippet, offset, instr, NULL); - - + gtk_snippet_add_line(snippet, list[i]); + /* TODO: free() */ } -#endif + ret = munmap(bin_data, length); + /* gtk_snippet_build_content(snippet); diff --git a/src/format/dwarf/d_dwarf.c b/src/format/dwarf/d_dwarf.c index 17dc711..ae7e4c0 100644 --- a/src/format/dwarf/d_dwarf.c +++ b/src/format/dwarf/d_dwarf.c @@ -75,4 +75,40 @@ dwarf_format *load_dwarf(const uint8_t *content, off_t length, exe_format *e_for } +/****************************************************************************** +* * +* Paramètres : format = informations chargées à consulter. * +* comments = liste des commentaires à insérer. [OUT] * +* offsets = liste des indices des commentaires. [OUT] * +* * +* Description : Récupère tous les commentaires à insérer dans le code. * +* * +* Retour : Nombre d'éléments mis en place. * +* * +* Remarques : - * +* * +******************************************************************************/ +size_t get_dwarf_comments(const dwarf_format *format, const char ***comments, uint64_t **offsets) +{ + size_t result; /* Quantité à retourner */ + size_t i; /* Boucle de parcours */ + + result = format->dbg_fc_count; + + if (result > 0) + { + *comments = (char **)calloc(result, sizeof(char *)); + *offsets = (uint64_t *)calloc(result, sizeof(uint64_t)); + + for (i = 0; i < result; i++) + { + (*comments)[i] = format->dbg_functions[i]->prototype; + (*offsets)[i] = format->dbg_functions[i]->low_pc; + } + + } + + return result; + +} diff --git a/src/format/dwarf/d_dwarf.h b/src/format/dwarf/d_dwarf.h index d432d5a..9b05adb 100644 --- a/src/format/dwarf/d_dwarf.h +++ b/src/format/dwarf/d_dwarf.h @@ -41,6 +41,8 @@ typedef struct _dwarf_format dwarf_format; /* Prend en charge un nouveau DWARF. */ dwarf_format *load_dwarf(const uint8_t *, off_t, exe_format *); +/* Récupère tous les commentaires à insérer dans le code. */ +size_t get_dwarf_comments(const dwarf_format *, const char ***, uint64_t **); diff --git a/src/gtksnippet.c b/src/gtksnippet.c index 7dc60f6..6470fcb 100644 --- a/src/gtksnippet.c +++ b/src/gtksnippet.c @@ -33,6 +33,79 @@ #define MARGIN_SPACE 4 + + + + +/****************************************************************************** +* * +* Paramètres : offset = position de l'instruction à ajouter. * +* instr = instruction à représenter ou NULL. * +* comment = commentaire à imprimer ou NULL. * +* * +* Description : Crée une ligne de représentation insérable. * +* * +* Retour : Struture rassemblant les informations mise en place. * +* * +* Remarques : - * +* * +******************************************************************************/ + +code_line_info *create_code_line_info(uint64_t offset, asm_instr *instr, const char *comment) +{ + code_line_info *result; /* Structure à renvoyer */ + + result = (code_line_info *)calloc(1, sizeof(code_line_info)); + + result->offset = offset; + result->instr = instr; + result->comment = (comment != NULL ? strdup(comment) : NULL); + + result->bp_set = FALSE; + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : line = informations à effacer de la mémoire. * +* * +* Description : Supprime une ligne de représentation. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void delete_code_line_info(code_line_info *line) +{ + free(line->instr); + free(line->comment); + + free(line); + +} + + + + + + + + + + + + + + + + + + static void gtk_snippet_class_init(GtkSnippetClass *klass); static void gtk_snippet_init(GtkSnippet *cpu); static void gtk_snippet_size_request(GtkWidget *widget, @@ -378,9 +451,7 @@ void gtk_snippet_set_processor(GtkSnippet *snippet, const asm_processor *proc) /****************************************************************************** * * * Paramètres : snippet = composant GTK à mettre à jour. * -* offset = position de l'instruction à ajouter. * -* instr = instruction à représenter ou NULL. * -* comment = commentaire à imprimer ou NULL. * +* line = informations à intégrer. * * * * Description : Ajoute une ligne dans le bloc de représentation. * * * @@ -390,14 +461,11 @@ void gtk_snippet_set_processor(GtkSnippet *snippet, const asm_processor *proc) * * ******************************************************************************/ -void gtk_snippet_add_line(GtkSnippet *snippet, uint64_t offset, asm_instr *instr, const char *comment) +void gtk_snippet_add_line(GtkSnippet *snippet, const code_line_info *line) { snippet->info = (code_line_info *)realloc(snippet->info, ++snippet->info_count * sizeof(code_line_info)); - snippet->info[snippet->info_count - 1].offset = offset; - snippet->info[snippet->info_count - 1].instr = instr; - snippet->info[snippet->info_count - 1].comment = (comment != NULL ? strdup(comment) : NULL); - snippet->info[snippet->info_count - 1].bp_set = FALSE; + snippet->info[snippet->info_count - 1] = *line; } diff --git a/src/gtksnippet.h b/src/gtksnippet.h index 349fd20..1858796 100644 --- a/src/gtksnippet.h +++ b/src/gtksnippet.h @@ -37,6 +37,24 @@ +typedef struct _code_line_info +{ + uint64_t offset; /* Position de l'instruction */ + asm_instr *instr; /* Eventuelle instruction */ + char *comment; /* Eventuel commentaire */ + + gboolean bp_set; /* Point d'arrêt défini */ + +} code_line_info; + + + + +/* Crée une ligne de représentation insérable. */ +code_line_info *create_code_line_info(uint64_t, asm_instr *, const char *); + +/* Supprime une ligne de représentation. */ +void delete_code_line_info(code_line_info *); @@ -63,15 +81,6 @@ typedef enum _AdressMode -typedef struct _code_line_info -{ - uint64_t offset; /* Position de l'instruction */ - asm_instr *instr; /* Eventuelle instruction */ - char *comment; /* Eventuel commentaire */ - - gboolean bp_set; /* Point d'arrêt défini */ - -} code_line_info; struct _GtkSnippet { @@ -113,7 +122,7 @@ void gtk_snippet_test(GtkSnippet *cpu); void gtk_snippet_set_processor(GtkSnippet *, const asm_processor *); /* Ajoute une ligne dans le bloc de représentation. */ -void gtk_snippet_add_line(GtkSnippet *, uint64_t, asm_instr *, const char *); +void gtk_snippet_add_line(GtkSnippet *, const code_line_info *); /* Définit le contenu visuel à partir des infos enregistrées. */ void gtk_snippet_build_content(GtkSnippet *); |