diff options
Diffstat (limited to 'src/format/elf/elf-int.h')
-rw-r--r-- | src/format/elf/elf-int.h | 113 |
1 files changed, 21 insertions, 92 deletions
diff --git a/src/format/elf/elf-int.h b/src/format/elf/elf-int.h index 4339475..f7fd804 100644 --- a/src/format/elf/elf-int.h +++ b/src/format/elf/elf-int.h @@ -25,115 +25,44 @@ #define _FORMAT_ELF_ELF_INT_H +#include "elf.h" +#include "elf_def.h" +#include "../executable-int.h" +#include "../../common/endianness.h" -#include <elf.h> -#include <sys/types.h> -#include "../exe_format-int.h" - - - -/* Chaîne de caractères présente */ -typedef struct _elf_string -{ - const char *value; /* Valeur humainement lisible */ - size_t len; /* Longueur de la chaîne */ - vmpa_t address; /* Adresse de localisation */ - -} elf_string; - -/* Symbole trouvé */ -typedef struct _elf_symbol -{ - const char *name; /* Désignation du symbole */ - uint64_t address; /* Adresse du symbole */ - off_t size; /* Taille du code associé */ - -} elf_symbol; - -/* Relocalisation trouvée */ -typedef struct _elf_relocation +/* Format d'exécutable générique (instance) */ +struct _GElfFormat { - const char *name; /* Désignation du symbole */ - vmpa_t address; /* Adresse du symbole */ + GExeFormat parent; /* A laisser en premier */ -} elf_relocation; - - - -/* Description du format ELF */ -struct _elf_format -{ - exe_format dummy; /* A laisser en premier */ - - Elf32_Ehdr header; /* En-tête du format */ + elf_header header; /* En-tête du format */ bool is_32b; /* Format du binaire */ - - char *sec_names; /* Noms des sections */ - size_t sec_size; /* Taille de ces définitions */ - - elf_relocation *relocations; /* Liste des relocalisations */ - size_t rel_count; /* Taille de cette liste */ - - GBinRoutine **routines; /* Liste des routines trouvées */ - size_t routines_count; /* Nombre de ces routines */ - - elf_symbol *symbols; /* Liste des symboles */ - size_t sym_count; /* Taille de cette liste */ - - elf_string *strings; /* Liste des chaînes */ - size_t str_count; /* Taille de cette liste */ + SourceEndian endian; /* Boutisme du format */ }; - - - -/* En-tête de programme ELF */ -typedef union _Elf_Phdr -{ - Elf32_Phdr header32; /* Version 32 bits */ - Elf64_Phdr header64; /* Version 64 bits */ - -} Elf_Phdr; - -#define ELF_PHDR(fmt, hdr, fld) (fmt->is_32b ? (hdr)->header32.fld : (hdr)->header64.fld) - - -/* Entrée de la table de relocalisation */ - -typedef union _Elf_Rel +/* Format d'exécutable générique (classe) */ +struct _GElfFormatClass { - Elf32_Rel rel32; /* Version 32 bits */ - Elf64_Rel rel64; /* Version 64 bits */ - -} Elf_Rel; - -#define ELF_SIZEOF_REL(fmt) (fmt->is_32b ? sizeof(Elf32_Rel) : sizeof(Elf64_Rel)) - -#define ELF_REL(fmt, rl, fld) (fmt->is_32b ? rl.rel32.fld : rl.rel64.fld) - -#define ELF_REL_SYM(fmt, rl) (fmt->is_32b ? ELF32_R_SYM(rl.rel32.r_info) : ELF64_R_SYM(rl.rel64.r_info)) -#define ELF_REL_TYPE(fmt, rl) (fmt->is_32b ? ELF32_R_TYPE(rl.rel32.r_info) : ELF64_R_TYPE(rl.rel64.r_info)) + GExeFormatClass parent; /* A laisser en premier */ +}; -/* Information sur un symbole */ - -typedef union _Elf_Sym -{ - Elf32_Sym sym32; /* Version 32 bits */ - Elf64_Sym sym64; /* Version 64 bits */ - -} Elf_Sym; -#define ELF_SIZEOF_SYM(fmt) (fmt->is_32b ? sizeof(Elf32_Sym) : sizeof(Elf64_Sym)) -#define ELF_SYM(fmt, sb, fld) (fmt->is_32b ? sb.sym32.fld : sb.sym64.fld) +/* Procède à la lecture d'une en-tête de programme ELF. */ +bool read_elf_program_header(const GElfFormat *, off_t *, elf_phdr *); +/* Procède à la lecture d'une en-tête de section ELF. */ +bool read_elf_section_header(const GElfFormat *, off_t, elf_shdr *); -#define ELF_ST_TYPE ELF32_ST_TYPE +/* Procède à la lecture d'un symbole ELF. */ +bool read_elf_symbol(const GElfFormat *, off_t *, elf_sym *); +/* Procède à la lecture d'une relocalisation ELF. */ +bool read_elf_relocation(const GElfFormat *, off_t *, elf_rel *); |