types_elf.h revision 5821806d5e7f356e8fa4b058a389a808ea183019
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef COURGETTE_ELF_TYPES_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define COURGETTE_ELF_TYPES_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This header defines various types from the ELF file spec, but no code
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// related to using them.
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef uint32 Elf32_Addr; // Unsigned program address
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef uint16 Elf32_Half; // Unsigned medium integer
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef uint32 Elf32_Off; // Unsigned file offset
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int32 Elf32_Sword; // Signed large integer
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef uint32 Elf32_Word; // Unsigned large integer
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The header at the top of the file
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Elf32_Ehdr {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unsigned char  e_ident[16];
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Elf32_Half     e_type;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Elf32_Half     e_machine;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Elf32_Word     e_version;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Elf32_Addr     e_entry;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Elf32_Off      e_phoff;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Elf32_Off      e_shoff;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Elf32_Word     e_flags;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Elf32_Half     e_ehsize;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Elf32_Half     e_phentsize;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Elf32_Half     e_phnum;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Elf32_Half     e_shentsize;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Elf32_Half     e_shnum;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Elf32_Half     e_shstrndx;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// values for header->e_type
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum e_type_values {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ET_NONE = 0, // No file type
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ET_REL = 1, // Relocatable file
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ET_EXEC = 2, // Executable file
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ET_DYN = 3, // Shared object file
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ET_CORE = 4, // Core file
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ET_LOPROC = 0xff00, // Processor-specific
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ET_HIPROC = 0xfff // Processor-specific
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// values for header->e_machine
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum e_machine_values {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EM_NONE = 0, // No machine
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EM_386 = 3, // Intel Architecture
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EM_x86_64 = 62, // Intel x86-64 Architecture
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Other values skipped
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A section header in the section header table
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Elf32_Shdr {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Elf32_Word   sh_name;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Elf32_Word   sh_type;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Elf32_Word   sh_flags;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Elf32_Addr   sh_addr;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Elf32_Off    sh_offset;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Elf32_Word   sh_size;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Elf32_Word   sh_link;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Elf32_Word   sh_info;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Elf32_Word   sh_addralign;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Elf32_Word   sh_entsize;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Values for the section type field in a section header
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum sh_type_values {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SHT_NULL = 0,
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SHT_PROGBITS = 1,
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SHT_SYMTAB = 2,
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SHT_STRTAB = 3,
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SHT_RELA = 4,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SHT_HASH = 5,
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SHT_DYNAMIC = 6,
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SHT_NOTE = 7,
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SHT_NOBITS = 8,
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SHT_REL = 9,
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SHT_SHLIB = 10,
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SHT_DYNSYM = 11,
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SHT_LOPROC = 0x70000000,
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SHT_HIPROC = 0x7fffffff,
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SHT_LOUSER = 0x80000000,
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SHT_HIUSER = 0xffffffff,
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Elf32_Phdr {
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Elf32_Word    p_type;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Elf32_Off     p_offset;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Elf32_Addr    p_vaddr;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Elf32_Addr    p_paddr;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Elf32_Word    p_filesz;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Elf32_Word    p_memsz;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Elf32_Word    p_flags;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Elf32_Word    p_align;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Values for the segment type field in a program segment header
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum ph_type_values {
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PT_NULL = 0,
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PT_LOAD = 1,
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PT_DYNAMIC = 2,
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PT_INTERP = 3,
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PT_NOTE = 4,
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PT_SHLIB = 5,
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PT_PHDR = 6,
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PT_LOPROC = 0x70000000,
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PT_HIPROC = 0x7fffffff
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Elf32_Rel {
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Elf32_Addr    r_offset;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Elf32_Word    r_info;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Elf32_Rela {
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Elf32_Addr    r_offset;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Elf32_Word    r_info;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Elf32_Sword   r_addend;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum elf32_rel_386_type_values {
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  R_386_NONE = 0,
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  R_386_32 = 1,
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  R_386_PC32 = 2,
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  R_386_GOT32 = 3,
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  R_386_PLT32 = 4,
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  R_386_COPY = 5,
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  R_386_GLOB_DAT = 6,
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  R_386_JMP_SLOT = 7,
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  R_386_RELATIVE = 8,
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  R_386_GOTOFF = 9,
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  R_386_GOTPC = 10,
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  R_386_TLS_TPOFF = 14,
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // COURGETTE_ELF_TYPES_H_
142