/* Copyright (C) 2007-2010 The Android Open Source Project
**
** This software is licensed under the terms of the GNU General Public
** License version 2, as published by the Free Software Foundation, and
** may be copied, distributed, and modified under those terms.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
** GNU General Public License for more details.
*/

/*
 * Contains declarations of types, constants and structures
 * describing ELF file format.
 */

#ifndef ELFF_ELH_H_
#define ELFF_ELH_H_

#include <stdint.h>
#include "elff/elff-common.h"

//=============================================================================
// ELF file definitions
//=============================================================================

/*
 * ELF format documentation uses Elf##_Xxx notation for data types, where
 * ## stands for CPU architecture (32, or 64 bit), and Xxx stands for a
 * specific type. For the sake of compliance, we will follow doc's notation
 * when defining types used in ELF file descriptors. However, for the sake of
 * code simplicity, we will drop CPU architecture index from the types that
 * have equal sizes on both, 32 and 64 bit architectures.
 */

/*
 * Architecture independent types.
 */

typedef uint8_t   Elf_Byte;
typedef int8_t    Elf_Sbyte;

typedef uint16_t  Elf_Half;
typedef int16_t   Elf_Shalf;

typedef uint32_t  Elf_Word;
typedef int32_t   Elf_Sword;

typedef uint64_t  Elf_Xword;
typedef int64_t   Elf_Sxword;

/*
 * Architecture dependent types.
 */

/* 32-bit ELF address. */
typedef uint32_t  Elf32_Addr;
/* 32-bit ELF offset. */
typedef uint32_t  Elf32_Off;

/* 64-bit ELF address. */
typedef uint64_t  Elf64_Addr;
/* 64-bit ELF offset. */
typedef uint64_t  Elf64_Off;

//=============================================================================
// ELF file header
//=============================================================================

/* Byte size of the fixed portion of ELF header. */
#define EI_NIDENT	16

/* Common (architecture independent portion of) ELF file header,
 * that starts at offset 0 in ELF file.
 */
typedef struct Elf_CommonHdr {
  union {
    struct {
      /* ei_mag0 - ei_mag3 contain ELF header signature. See ELFMAGx bellow. */
      Elf_Byte  ei_mag0;
      Elf_Byte  ei_mag1;
      Elf_Byte  ei_mag2;
      Elf_Byte  ei_mag3;

      /* File class (32, or 64 bits). See ELFCLASSxxx bellow. */
      Elf_Byte  ei_class;

      /* Data encoding (endianness). See ELFDATAxxx bellow. */
      Elf_Byte  ei_data;

      /* ELF header version number. */
      Elf_Byte  ei_version;
    } ei_info;
    unsigned char e_ident[EI_NIDENT];
  };

  /* File type (executable, shared object, etc.) */
  Elf_Half      e_type;

  /* Processor type. */
  Elf_Half      e_machine;

  /* File version. */
  Elf_Word      e_version;
} Elf_CommonHdr;


/* ELF header signature. */
#define ELFMAG0		0x7f
#define ELFMAG1		'E'
#define ELFMAG2		'L'
#define ELFMAG3		'F'
#define ELFMAG		"\177ELF"
#define SELFMAG		4

/*
 * Possible ei_class values.
 */

/* Invalid. */
#define ELFCLASSNONE  0
/* It's 32-bit ELF file. */
#define ELFCLASS32    1
/* It's 64-bit ELF file. */
#define ELFCLASS64    2

/*
 * Possible ei_data values.
 */

/* Invalid. */
#define ELFDATANONE   0
/* ELF data is formatted in little-endian. */
#define ELFDATA2LSB   1
/* ELF data is formatted in big-endian. */
#define ELFDATA2MSB   2

/* Tempated (architecture dependent) ELF file header.
 * Template param:
 *  Elf_Addr - Actual type for address encoding (Elf32_Addr, or Elf64_Addr).
 *  Elf_Off - Actual type for offset encoding (Elf32_Off, or Elf64_Off).
 */
template <typename Elf_Addr, typename Elf_Off>
struct Elf_FHdr {
  /* Common header. */
  Elf_CommonHdr common;

  /* Module entry point. */
  Elf_Addr      e_entry;

  /* Programm header table offset (in bytes) from the beginning of the file.
   * Zero if there is no programm header in this file.
   */
  Elf_Off       e_phoff;

  /* Section header table offset (in bytes) from the beginning of the file.
   * Zero if there is no section header in this file.
   */
  Elf_Off       e_shoff;

  /* Processor-specific flags. */
  Elf_Word      e_flags;

  /* This header size in bytes. */
  Elf_Half      e_ehsize;

  /* Byte size of an entry in programm header table. All entries
   * in the table are the same size.
   */
  Elf_Half      e_phentsize;

  /* Number of entries in programm header table. */
  Elf_Half      e_phnum;

  /* Byte size of an entry in section header table. All entries
   * in the table are the same size.
   */
  Elf_Half      e_shentsize;

  /* Number of entries in section header table. */
  Elf_Half      e_shnum;

  /* Zero-based index of an entry for name string table section in the section
   * header table. If no such section exists in the file this field contains
   * SHN_UNDEF value.
   */
  Elf_Half      e_shstrndx;
};
/* 32-bit ELF header. */
typedef Elf_FHdr<Elf32_Addr, Elf32_Off> Elf32_FHdr;
/* 64-bit ELF header. */
typedef Elf_FHdr<Elf64_Addr, Elf64_Off> Elf64_FHdr;

//=============================================================================
// ELF section header
//=============================================================================

/* Templated (architecture dependent) section header for ELF file.
 * Template param:
 *  Elf_Addr - Actual type for address encoding (Elf32_Addr, or Elf64_Addr).
 *  Elf_Off - Actual type for offset encoding (Elf32_Off, or Elf64_Off).
 */
template <typename Elf_Addr, typename Elf_Off>
struct Elf_SHdr {
  /* Index (byte offset) of section name in the name string table section. */
  Elf_Word    sh_name;

  /* Section type and semantics. */
  Elf_Word    sh_type;

  /* Section flags and attributes. */
  Elf_Word    sh_flags;

  /* Section address in the memory image of the process. */
  Elf_Addr    sh_addr;

  /* Byte offset from the beginning of the ELF file to the first
   * byte in the section.
   */
  Elf_Off     sh_offset;

  /* Section size in bytes. */
  Elf_Word    sh_size;

  /* Section header table index link. Depends on section type. */
  Elf_Word    sh_link;

  /* Extra section information, depending on the section type. */
  Elf_Word    sh_info;

  /* Address alignment constrains. 0 and 1 means that section has no
   * alignment constrains.
   */
  Elf_Word    sh_addralign;

  /* Entry size for sections that hold some kind of a table. */
  Elf_Word    sh_entsize;
};
/* 32-bit section header. */
typedef Elf_SHdr<Elf32_Addr, Elf32_Off> Elf32_SHdr;
/* 64-bit section header. */
typedef Elf_SHdr<Elf64_Addr, Elf64_Off> Elf64_SHdr;

/*
 * Special section indices
 */
#define SHN_UNDEF       0
#define SHN_LORESERVE   0xff00
#define SHN_LOPROC      0xff00
#define SHN_HIPROC      0xff1f
#define SHN_LOOS        0xff20
#define SHN_HIOS        0xff3f
#define SHN_ABS         0xfff1
#define SHN_COMMON      0xfff2
#define SHN_XINDEX      0xffff
#define SHN_HIRESERVE   0xffff

/*
 * Values for sh_type
 */
#define SHT_NULL            0
#define SHT_PROGBITS        1
#define SHT_SYMTAB          2
#define SHT_STRTAB          3
#define SHT_RELA            4
#define SHT_HASH            5
#define SHT_DYNAMIC         6
#define SHT_NOTE            7
#define SHT_NOBITS          8
#define SHT_REL             9
#define SHT_SHLIB           10
#define SHT_DYNSYM          11
#define SHT_INIT_ARRAY      14
#define SHT_FINI_ARRAY      15
#define SHT_PREINIT_ARRAY   16
#define SHT_GROUP           17
#define SHT_SYMTAB_SHNDX    18
#define SHT_NUM             19

#endif  // ELFF_ELH_H_
