summaryrefslogtreecommitdiff
path: root/src/format/elf/elf-int.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2010-04-05 19:11:16 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2010-04-05 19:11:16 (GMT)
commitc853ed6c88a82e2859033c4111b0edb0372bc570 (patch)
treefba98d186b6e80539c1e5aad9910316c0cb3725c /src/format/elf/elf-int.c
parentb6fd6dc823615aaee8661e8e2365181c1ea1775f (diff)
Reorganized the ELF header (32 or 64 bits).
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@148 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/format/elf/elf-int.c')
-rw-r--r--src/format/elf/elf-int.c102
1 files changed, 102 insertions, 0 deletions
diff --git a/src/format/elf/elf-int.c b/src/format/elf/elf-int.c
index 69363d2..85bdfc0 100644
--- a/src/format/elf/elf-int.c
+++ b/src/format/elf/elf-int.c
@@ -24,6 +24,108 @@
#include "elf-int.h"
+#include <string.h>
+
+
+
+/******************************************************************************
+* *
+* Paramètres : content = contenu binaire à parcourir. *
+* length = taille du contenu en question. *
+* header = en-tête à déterminer. [OUT] *
+* is_32b = indique si le format est en 32 ou 64 bits. [OUT] *
+* endian = boutisme reconnu dans le format. [OUT] *
+* *
+* Description : Procède à la lecture de l'en-tête d'un contenu binaire ELF. *
+* *
+* Retour : Bilan de l'opération. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+bool read_elf_header(const bin_t *content, off_t length, elf_header *header, bool *is_32b, SourceEndian *endian)
+{
+ bool result; /* Bilan à retourner */
+ off_t pos; /* Position de lecture */
+
+ result = (length >= EI_NIDENT);
+
+ pos = 0;
+
+ if (result)
+ {
+ memcpy(header->hdr32.e_ident, content, EI_NIDENT);
+ pos += EI_NIDENT;
+ }
+
+ /* Détermination de l'espace d'adressage */
+ if (result)
+ switch (header->hdr32.e_ident[EI_CLASS])
+ {
+ case ELFCLASS32:
+ *is_32b = true;
+ break;
+ case ELFDATA2MSB:
+ *is_32b = false;
+ break;
+ default:
+ result = false;
+ break;
+ }
+
+ /* Détermination du boutisme */
+ if (result)
+ switch (header->hdr32.e_ident[EI_DATA])
+ {
+ case ELFDATA2LSB:
+ *endian = SRE_LITTLE;
+ break;
+ case ELFDATA2MSB:
+ *endian = SRE_BIG;
+ break;
+ default:
+ result = false;
+ break;
+ }
+
+ if (*is_32b)
+ {
+ result &= read_u16(&header->hdr32.e_type, content, &pos, length, *endian);
+ result &= read_u16(&header->hdr32.e_machine, content, &pos, length, *endian);
+ result &= read_u32(&header->hdr32.e_version, content, &pos, length, *endian);
+ result &= read_u32(&header->hdr32.e_entry, content, &pos, length, *endian);
+ result &= read_u32(&header->hdr32.e_phoff, content, &pos, length, *endian);
+ result &= read_u32(&header->hdr32.e_shoff, content, &pos, length, *endian);
+ result &= read_u32(&header->hdr32.e_flags, content, &pos, length, *endian);
+ result &= read_u16(&header->hdr32.e_ehsize, content, &pos, length, *endian);
+ result &= read_u16(&header->hdr32.e_phentsize, content, &pos, length, *endian);
+ result &= read_u16(&header->hdr32.e_phnum, content, &pos, length, *endian);
+ result &= read_u16(&header->hdr32.e_shentsize, content, &pos, length, *endian);
+ result &= read_u16(&header->hdr32.e_shnum, content, &pos, length, *endian);
+ result &= read_u16(&header->hdr32.e_shstrndx, content, &pos, length, *endian);
+ }
+ else
+ {
+ result &= read_u16(&header->hdr64.e_type, content, &pos, length, *endian);
+ result &= read_u16(&header->hdr64.e_machine, content, &pos, length, *endian);
+ result &= read_u32(&header->hdr64.e_version, content, &pos, length, *endian);
+ result &= read_u64(&header->hdr64.e_entry, content, &pos, length, *endian);
+ result &= read_u64(&header->hdr64.e_phoff, content, &pos, length, *endian);
+ result &= read_u64(&header->hdr64.e_shoff, content, &pos, length, *endian);
+ result &= read_u32(&header->hdr64.e_flags, content, &pos, length, *endian);
+ result &= read_u16(&header->hdr64.e_ehsize, content, &pos, length, *endian);
+ result &= read_u16(&header->hdr64.e_phentsize, content, &pos, length, *endian);
+ result &= read_u16(&header->hdr64.e_phnum, content, &pos, length, *endian);
+ result &= read_u16(&header->hdr64.e_shentsize, content, &pos, length, *endian);
+ result &= read_u16(&header->hdr64.e_shnum, content, &pos, length, *endian);
+ result &= read_u16(&header->hdr64.e_shstrndx, content, &pos, length, *endian);
+ }
+
+ return result;
+
+}
+
/******************************************************************************
* *