summaryrefslogtreecommitdiff
path: root/src/format/elf
diff options
context:
space:
mode:
Diffstat (limited to 'src/format/elf')
-rw-r--r--src/format/elf/elf.c13
-rw-r--r--src/format/elf/strings.c14
2 files changed, 23 insertions, 4 deletions
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);