summaryrefslogtreecommitdiff
path: root/src/format/elf/elf_def.h
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_def.h
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_def.h')
-rw-r--r--src/format/elf/elf_def.h71
1 files changed, 46 insertions, 25 deletions
diff --git a/src/format/elf/elf_def.h b/src/format/elf/elf_def.h
index d063dcf..f125106 100644
--- a/src/format/elf/elf_def.h
+++ b/src/format/elf/elf_def.h
@@ -29,43 +29,42 @@
-/* Adresses virtuelles */
-typedef union _elf_addr
-{
- uint32_t addr32; /* Elf 32 bits */
- uint64_t addr64; /* Elf 64 bits */
-
-} elf_addr;
-
-/* Positions dans le fichier */
-typedef union _elf_off
-{
- uint32_t off32; /* Elf 32 bits */
- uint64_t off64; /* Elf 64 bits */
-
-} elf_off;
-
-
-#define ELF_OFF(fmt, off) (fmt->is_32b ? (off).off32 : (off).off64)
+/* ---------------------------- EN-TETE DES FICHIERS ELF ---------------------------- */
+#define EI_NIDENT 16
-/* ---------------------------- EN-TETE DES FICHIERS ELF ---------------------------- */
+/* En-tête de fichier ELF (32 et 64 bits) */
-#define EI_NIDENT 16
+typedef struct _elf32_header
+{
+ uint8_t e_ident[EI_NIDENT]; /* Magic number + informations */
+ uint16_t e_type; /* Type de fichier */
+ uint16_t e_machine; /* Architecture */
+ uint32_t e_version; /* Version du type de fichier */
+ uint32_t e_entry; /* Point d'entrée du programme */
+ uint32_t e_phoff; /* Début de la table 'Program' */
+ uint32_t e_shoff; /* Début de la table 'Section' */
+ uint32_t e_flags; /* Prop. spécifiques au proc. */
+ uint16_t e_ehsize; /* Taille de l'en-tête en oct. */
+ uint16_t e_phentsize; /* Taille d'une entrée Program */
+ uint16_t e_phnum; /* Nombre d'éléments 'Program' */
+ uint16_t e_shentsize; /* Taille d'une entrée Section */
+ uint16_t e_shnum; /* Nombre d'éléments 'Section' */
+ uint16_t e_shstrndx; /* Indice de la section chaînes*/
+} elf32_header;
-/* En-tête de fichier ELF */
-typedef struct _elf_header
+typedef struct _elf64_header
{
uint8_t e_ident[EI_NIDENT]; /* Magic number + informations */
uint16_t e_type; /* Type de fichier */
uint16_t e_machine; /* Architecture */
uint32_t e_version; /* Version du type de fichier */
- elf_addr e_entry; /* Point d'entrée du programme */
- elf_off e_phoff; /* Début de la table 'Program' */
- elf_off e_shoff; /* Début de la table 'Section' */
+ uint64_t e_entry; /* Point d'entrée du programme */
+ uint64_t e_phoff; /* Début de la table 'Program' */
+ uint64_t e_shoff; /* Début de la table 'Section' */
uint32_t e_flags; /* Prop. spécifiques au proc. */
uint16_t e_ehsize; /* Taille de l'en-tête en oct. */
uint16_t e_phentsize; /* Taille d'une entrée Program */
@@ -74,9 +73,31 @@ typedef struct _elf_header
uint16_t e_shnum; /* Nombre d'éléments 'Section' */
uint16_t e_shstrndx; /* Indice de la section chaînes*/
+} elf64_header;
+
+typedef union _elf_header
+{
+ elf32_header hdr32; /* Version 32 bits */
+ elf64_header hdr64; /* Version 64 bits */
+
} elf_header;
+#define ELF_HDR(fmt, hdr, fld) (fmt->is_32b ? (hdr).hdr32.fld : (hdr).hdr64.fld)
+
+#define ELF_HDR_SET(fmt, hdr, fld, val) \
+ do \
+ { \
+ if (fmt->is_32b) (hdr).hdr32.fld = val; \
+ else (hdr).hdr64.fld = val; \
+ } \
+ while (0)
+
+#define ELF_HDR_OFFSET_OF(fmt, fld) (fmt->is_32b ? offsetof(elf32_header, fld) : offsetof(elf64_header, fld))
+
+#define ELF_SIZEOF_HDR(fmt) (fmt->is_32b ? sizeof(elf32_header) : sizeof(elf64_header))
+
+
/* Composition du champ e_ident */