/* 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_ extern "C" { #include "qemu-common.h" } #include "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_