summaryrefslogtreecommitdiff
path: root/src/format/elf
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2015-08-12 19:05:31 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2015-08-12 19:05:31 (GMT)
commit4b2f65ed2125cd7b6ef598cf02738f6c839d8935 (patch)
treede62e9daaafe63248c45202004758e91b7341cc5 /src/format/elf
parentb5c6bcea25b1b840fd6c8e89a4a3c9fbd83ba84b (diff)
Extended the loading process of binary formats to prepare the DWARF support.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@568 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/format/elf')
-rw-r--r--src/format/elf/elf.c57
-rw-r--r--src/format/elf/elf.h5
2 files changed, 54 insertions, 8 deletions
diff --git a/src/format/elf/elf.c b/src/format/elf/elf.c
index bf5a7a2..7f3af9f 100644
--- a/src/format/elf/elf.c
+++ b/src/format/elf/elf.c
@@ -75,31 +75,38 @@ static bool g_elf_format_translate_offset_into_vmpa(const GElfFormat *, phys_t,
/* Fournit l'emplacement correspondant à une position physique. */
static bool g_elf_format_translate_address_into_vmpa(const GElfFormat *, virt_t, vmpa2t *);
+/* Fournit l'emplacement d'une section donnée. */
+bool g_elf_format_get_section_range_by_name(const GElfFormat *, const char *, mrange_t *);
+
/******************************************************************************
* *
* Paramètres : content = contenu binaire à parcourir. *
+* parent = éventuel format exécutable déjà chargé. *
* *
* Description : Indique si le format peut être pris en charge ici. *
* *
-* Retour : true si la réponse est positive, false sinon. *
+* Retour : Désignation du format reconnu ou NULL si aucun. *
* *
* Remarques : - *
* *
******************************************************************************/
-bool elf_is_matching(GBinContent *content)
+const char *elf_is_matching(GBinContent *content, GExeFormat *parent)
{
- bool result; /* Bilan à faire connaître */
+ const char *result; /* Format détecté à renvoyer */
vmpa2t addr; /* Tête de lecture initiale */
+ bool status; /* Bilan des accès mémoire */
char magic[4]; /* Idenfiant standard */
init_vmpa(&addr, 0, VMPA_NO_VIRTUAL);
- result = g_binary_content_get_raw(content, &addr, 4, (bin_t *)magic);
+ status = g_binary_content_get_raw(content, &addr, 4, (bin_t *)magic);
+
+ status &= (memcmp(magic, "\x7f\x45\x4c\x46" /* .ELF */, 4) == 0);
- result &= (memcmp(magic, "\x7f\x45\x4c\x46" /* .ELF */, 4) == 0);
+ result = status ? "elf" : NULL;
return result;
@@ -137,6 +144,8 @@ static void g_elf_format_class_init(GElfFormatClass *klass)
exe->translate_phys = (translate_phys_fc)g_elf_format_translate_offset_into_vmpa;
exe->translate_virt = (translate_virt_fc)g_elf_format_translate_address_into_vmpa;
+ exe->get_range_by_name = (get_range_by_name_fc)g_elf_format_get_section_range_by_name;
+
}
@@ -205,6 +214,7 @@ static void g_elf_format_finalize(GElfFormat *format)
/******************************************************************************
* *
* Paramètres : content = contenu binaire à parcourir. *
+* parent = éventuel format exécutable déjà chargé. *
* *
* Description : Prend en charge un nouveau format ELF. *
* *
@@ -214,7 +224,7 @@ static void g_elf_format_finalize(GElfFormat *format)
* *
******************************************************************************/
-GBinFormat *g_elf_format_new(GBinContent *content)
+GBinFormat *g_elf_format_new(GBinContent *content, GExeFormat *parent)
{
GElfFormat *result; /* Structure à retourner */
@@ -502,6 +512,41 @@ static bool g_elf_format_translate_address_into_vmpa(const GElfFormat *format, v
/******************************************************************************
* *
+* Paramètres : format = description de l'exécutable à consulter. *
+* name = nom de la section recherchée. *
+* range = emplacement en mémoire à renseigner. [OUT] *
+* *
+* Description : Fournit l'emplacement d'une section donnée. *
+* *
+* Retour : Bilan de l'opération. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+bool g_elf_format_get_section_range_by_name(const GElfFormat *format, const char *name, mrange_t *range)
+{
+ bool result; /* Bilan à retourner */
+ phys_t offset; /* Position physique de section*/
+ phys_t size; /* Taille de la section trouvée*/
+ virt_t address; /* Adresse virtuelle de section*/
+ vmpa2t tmp; /* Adresse à initialiser */
+
+ result = find_elf_section_content_by_name(format, name, &offset, &size, &address);
+
+ if (result)
+ {
+ init_vmpa(&tmp, offset, address);
+ init_mrange(range, &tmp, size);
+ }
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : format = informations chargées à consulter. *
* *
* Description : Présente l'en-tête ELF du format chargé. *
diff --git a/src/format/elf/elf.h b/src/format/elf/elf.h
index 484cda8..8e9a2cc 100644
--- a/src/format/elf/elf.h
+++ b/src/format/elf/elf.h
@@ -31,6 +31,7 @@
#include "elf_def.h"
+#include "../executable.h"
#include "../format.h"
@@ -50,13 +51,13 @@ typedef struct _GElfFormatClass GElfFormatClass;
/* Indique si le format peut être pris en charge ici. */
-bool elf_is_matching(GBinContent *);
+const char *elf_is_matching(GBinContent *, GExeFormat *);
/* Indique le type défini pour un format d'exécutable ELF. */
GType g_elf_format_get_type(void);
/* Prend en charge un nouveau format ELF. */
-GBinFormat *g_elf_format_new(GBinContent *);
+GBinFormat *g_elf_format_new(GBinContent *, GExeFormat *);
/* Présente l'en-tête ELF du format chargé. */
const elf_header *g_elf_format_get_header(const GElfFormat *);