summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog13
-rw-r--r--src/binary.c94
-rw-r--r--src/format/dwarf/d_dwarf.c36
-rw-r--r--src/format/dwarf/d_dwarf.h2
-rw-r--r--src/gtksnippet.c84
-rw-r--r--src/gtksnippet.h29
6 files changed, 189 insertions, 69 deletions
diff --git a/ChangeLog b/ChangeLog
index ebdb7c5..c1d9438 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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 *);