diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2010-04-05 19:11:16 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2010-04-05 19:11:16 (GMT) |
commit | c853ed6c88a82e2859033c4111b0edb0372bc570 (patch) | |
tree | fba98d186b6e80539c1e5aad9910316c0cb3725c /src/format/elf/elf_def.h | |
parent | b6fd6dc823615aaee8661e8e2365181c1ea1775f (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.h | 71 |
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 */ |