//Declaration des alias

/*
 Def ELF : 

 The  header  file  <elf.h>  defines the format of ELF executable binary
       files.  Amongst these files are normal  executable  files,  relocatable
       object files, core files and shared libraries.

       An executable file using the ELF file format consists of an ELF header,
       followed by a program header table or a section header table, or  both.
       The  ELF  header  is  always  at  offset zero of the file.  The program
       header table and the section header table's  offset  in  the  file  are
       defined  in  the  ELF  header.  The two tables describe the rest of the
       particularities of the file
 */


/* Type for a 16-bit quantity.  */

type Elf32_Half = u16;

type Elf64_Half = u16;

/* Types for signed and unsigned 32-bit quantities.  */

type Elf32_Word = u32;

type Elf32_Sword = i32;

type Elf64_Word = u32;

type Elf64_Sword = i32;

/* Types for signed and unsigned 64-bit quantities.  */

type Elf32_Xword = u64;

type Elf32_Sxword = i64;

type Elf64_Xword = u64;

type Elf64_Sxword = i64;

/* Type of addresses.  */

type Elf32_Addr = u32;

type Elf64_Addr = u64;

/* Type of file offsets.  */

type Elf32_Off = u32;

type Elf64_Off = u64;

//role de ce truc ?
const EI_NIDENT : u8 = 16;

//ELF file header 32 bits
struct Elf32Ehdr{
      e_ident : [u8;EI_NIDENT],//16 octects décrivant comment le fichier doit etre parsé
      //e_ident must starts with magice number : 0x 7f 45 4c 46
      e_type : Elf32_Half,//type of the file
      e_machine : Elf32_Half,//type architecture machine
      e_version : Elf32_Word,//always 1
      e_entry : Elf32_Addr,//entry point @ for executable
      e_phoff : Elf32_Off,//Offset of the program header table
      e_shoff : Elf32_Off,//Offset of the section header table
      e_flags : Elf32_Word,//des flags ?
      e_ehsize : Elf32_Half,//size of this (the header), redundant
      e_phentsize : Elf32_Half,//size per program header
      e_phnum : Elf32_Half,//number of program header
      e_shentsize : Elf32_Half,//size per section header
      e_shnum : Elf32_Half,//number of section header
      e_shstrndx : Elf32_Half//section header string table index
}


//ELF file header 64 bits
//les champs ont le meme rôle que dans le header 32 bits
struct Elf64Ehdr{
      e_ident : [u8;EI_NIDENT],
      e_type : Elf64_Half,
      e_machine : Elf64_Half,
      e_version : Elf64_Word,
      e_entry : Elf64_Addr,
      e_phoff : Elf64_Off,
      e_shoff : Elf64_Off,
      e_flags : Elf64_Word,
      e_ehsize : Elf64_Half,
      e_phentsize : Elf64_Half,
      e_phnum : Elf64_Half,
      e_shentsize : Elf64_Half,
      e_shnum : Elf64_Half,
      e_shstrndx : Elf64_Half
}



/* e_ident offsets */
const EI_MAG0 : u32 = 0;
const EI_MAG1 : u32 = 1;
const EI_MAG2 : u32 = 2;
const EI_MAG3 : u32 = 3;
const EI_CLASS : u32 = 4;  
const EI_DATA : u32 = 5;  
const EI_VERSION : u32 = 6;  
const EI_PAD : u32 = 7;  

/* e_ident[EI_CLASS] */
const ELFCLASSNONE : u32 = 0;
const ELFCLASS32 : u32 = 1;
const ELFCLASS64 : u32 = 2;

/* e_ident[EI_DATA] */
const ELFDATANONE : u32 = 0;
const  ELFDATA2LSB : u32 = 1;
const  ELFDATA2MSB : u32 = 2;

/* e_type */
const  ET_NONE : u32 = 0;  /* No file type       */
const  ET_REL : u32 = 1;  /* Relocatable file   */
const  ET_EXEC : u32 = 2;  /* Executable file    */
const  ET_DYN : u32 = 3;  /* Shared object file */
const  ET_CORE : u32 = 4;  /* Core file          */
const  ET_LOPROC : u32 = 0xff00;  /* Processor-specific */
const  ET_HIPROC : u32 = 0xffff;  /* Processor-specific */

/* e_machine */
const  EM_NONE : u32 = 0;  /* No machine     */
const  EM_M32 : u32 = 1;  /* AT&T WE 32100  */
const  EM_SPARC : u32 = 2;  /* SPARC          */
const  EM_386 : u32 = 3; /* Intel 80386    */
const  EM_68K : u32 = 4;  /* Motorola 68000 */
const  EM_88K : u32 = 5;  /* Motorola 88000 */
const  EM_860 : u32 = 7;  /* Intel 80860    */
const  EM_MIPS : u32 = 8; /* MIPS R3000     */
const  EM_RISC : u32 = 243; /* RISCV */

/* e_version */
 const EV_NONE : u32 = 0; /* invalid version */
 const EV_CURRENT : u32 = 1; /* current version */
