summaryrefslogtreecommitdiff
path: root/src/format
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2009-11-18 23:20:16 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2009-11-18 23:20:16 (GMT)
commit783e5e1977c1e4dadf938befa9fce9a311079413 (patch)
tree995423e1069e31db4fe0517fb9a45432dafceb6d /src/format
parent26d75963fba34d8e5a5b9a6186604110552f3a38 (diff)
Saved the current work on binary parts selection.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@137 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/format')
-rw-r--r--src/format/elf/elf.c15
-rw-r--r--src/format/elf/section.c2
-rw-r--r--src/format/part.c19
-rw-r--r--src/format/part.h3
4 files changed, 38 insertions, 1 deletions
diff --git a/src/format/elf/elf.c b/src/format/elf/elf.c
index 34c7521..f32bce7 100644
--- a/src/format/elf/elf.c
+++ b/src/format/elf/elf.c
@@ -407,14 +407,19 @@ static GBinPart **g_elf_format_get_parts(const GElfFormat *format, size_t *count
{
GBinPart **result; /* Tableau à retourner */
uint16_t i; /* Boucle de parcours */
+ elf_shdr strings; /* Section des descriptions */
+ bool has_strings; /* Section trouvée ? */
elf_shdr section; /* En-tête de section ELF */
GBinPart *part; /* Partie à intégrer à la liste*/
+ const char *name; /* Nom trouvé ou NULL */
off_t offset; /* Début de part de programme */
elf_phdr phdr; /* En-tête de programme ELF */
result = NULL;
*count = 0;
+ has_strings = find_elf_section_by_index(format, format->header.e_shstrndx, &strings);
+
/* Première tentative : les sections */
for (i = 0; i < format->header.e_shnum; i++)
@@ -427,7 +432,15 @@ static GBinPart **g_elf_format_get_parts(const GElfFormat *format, size_t *count
{
part = g_binary_part_new();
- /* TODO : nom, droits/type */
+ if (has_strings)
+ {
+ name = extract_name_from_elf_string_section(format, &strings,
+ ELF_SHDR(format, section, sh_name));
+
+ if (name != NULL)
+ g_binary_part_set_name(part, name);
+
+ }
g_binary_part_set_values(part,
ELF_SHDR(format, section, sh_offset),
diff --git a/src/format/elf/section.c b/src/format/elf/section.c
index e019648..f837dbf 100644
--- a/src/format/elf/section.c
+++ b/src/format/elf/section.c
@@ -92,6 +92,8 @@ bool find_elf_section_by_name(const GElfFormat *format, const char *name, elf_sh
secname = extract_name_from_elf_string_section(format, &strings,
ELF_SHDR(format, *section, sh_name));
+ /* FIXME : if secname == NULL */
+
result = (strcmp(name, secname) == 0);
}
diff --git a/src/format/part.c b/src/format/part.c
index 2096c6d..d21cd87 100644
--- a/src/format/part.c
+++ b/src/format/part.c
@@ -145,6 +145,25 @@ void g_binary_part_set_name(GBinPart *part, const char *name)
/******************************************************************************
* *
+* Paramètres : part = description de partie à mettre à jour. *
+* *
+* Description : Fournit la description attribuée à une partie de code. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+const char *g_binary_part_get_name(const GBinPart *part)
+{
+ return part->name;
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : part = description de partie à mettre à jour. *
* offset = position de la section à conserver. *
* size = taille de la section à conserver. *
diff --git a/src/format/part.h b/src/format/part.h
index aec324d..ff18fc9 100644
--- a/src/format/part.h
+++ b/src/format/part.h
@@ -57,6 +57,9 @@ GBinPart *g_binary_part_new(void);
/* Attribue une description humaine à une partie de code. */
void g_binary_part_set_name(GBinPart *, const char *);
+/* Fournit la description attribuée à une partie de code. */
+const char *g_binary_part_get_name(const GBinPart *);
+
/* Définit les valeurs utiles d'une partie de code. */
void g_binary_part_set_values(GBinPart *, off_t, off_t, vmpa_t);