#ifndef _ELF_HEADERS_H_
#define _ELF_HEADERS_H_

/* Header Data Types */
#define Elf32_Addr      unsigned int
#define Elf32_Half      unsigned short
#define Elf32_Off       unsigned int
#define Elf32_Sword     int
#define Elf32_Word      unsigned int

/* e_ident indices */
#define EI_MAG0	      0
#define EI_MAG1       1
#define EI_MAG2	      2
#define EI_MAG3       3
#define EI_CLASS      4
#define EI_DATA	      5
#define EI_VERSION    6
#define EI_OSABI      7
#define EI_ABIVERSION 8
#define EI_PAD        9
/* and the size of it */
#define EI_NIDENT    16

/* ELF magic word (e_ident 0-3) */
#define ELFMAG0      0x7f
#define ELFMAG1      'E'
#define ELFMAG2      'L'
#define ELFMAG3      'F'

/* ELF class (e_ident 4) */
#define ELFCLASSNONE  0
#define ELFCLASS32    1
#define ELFCLASS64    2

/* ELF data (e_ident 5) */
#define ELFDATANONE   0
#define ELFDATA2LSB   1
#define ELFDATA2MSB   2

/* ELF type (e_type) */
#define ET_NONE       0
#define ET_REL        1
#define ET_EXEC       2
#define ET_DYN        3
#define ET_CORE       4

/* ELF machine (e_machine) */
#define EM_ARM       40

/* ELF version */
#define EV_NONE       0
#define EV_CURRENT    1

/* ELF File Header */
typedef struct {

  unsigned char e_ident[EI_NIDENT];
  Elf32_Half    e_type;
  Elf32_Half    e_machine;
  Elf32_Word    e_version;
  Elf32_Addr    e_entry;
  Elf32_Off     e_phoff;
  Elf32_Off     e_shoff;
  Elf32_Word    e_flags;
  Elf32_Half    e_ehsize;
  Elf32_Half    e_phentsize;
  Elf32_Half    e_phnum;
  Elf32_Half    e_shentsize;
  Elf32_Half    e_shnum;
  Elf32_Half    e_shstrndx;

} Elf32_Ehdr;

/* Section header */
typedef struct {

  Elf32_Word   sh_name;
  Elf32_Word   sh_type;
  Elf32_Word   sh_flags;
  Elf32_Addr   sh_addr;
  Elf32_Off    sh_offset;
  Elf32_Word   sh_size;
  Elf32_Word   sh_link;
  Elf32_Word   sh_info;
  Elf32_Word   sh_addralign;
  Elf32_Word   sh_entsize;

} Elf32_Shdr;

/* Program header types */
#define PT_NULL       0
#define PT_LOAD	      1
#define PT_DYNAMIC    2
#define PT_INTERP     3
#define PT_NOTE	      4
#define PT_SHLIB      5
#define PT_PHDR	      6
#define PT_TLS	      7

/* Program header */
typedef struct {

  Elf32_Word   p_type;
  Elf32_Off    p_offset;
  Elf32_Addr   p_vaddr;
  Elf32_Addr   p_paddr;
  Elf32_Word   p_filesz;
  Elf32_Word   p_memsz;
  Elf32_Word   p_flags;
  Elf32_Word   p_align;

} Elf32_Phdr;

#endif
