1// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef COURGETTE_ELF_TYPES_H_
6#define COURGETTE_ELF_TYPES_H_
7
8//
9// This header defines various types from the ELF file spec, but no code
10// related to using them.
11//
12
13typedef uint32 Elf32_Addr;  // Unsigned program address
14typedef uint16 Elf32_Half;  // Unsigned medium integer
15typedef uint32 Elf32_Off;  // Unsigned file offset
16typedef int32 Elf32_Sword;  // Signed large integer
17typedef uint32 Elf32_Word;  // Unsigned large integer
18
19
20// The header at the top of the file
21struct Elf32_Ehdr {
22  unsigned char  e_ident[16];
23  Elf32_Half     e_type;
24  Elf32_Half     e_machine;
25  Elf32_Word     e_version;
26  Elf32_Addr     e_entry;
27  Elf32_Off      e_phoff;
28  Elf32_Off      e_shoff;
29  Elf32_Word     e_flags;
30  Elf32_Half     e_ehsize;
31  Elf32_Half     e_phentsize;
32  Elf32_Half     e_phnum;
33  Elf32_Half     e_shentsize;
34  Elf32_Half     e_shnum;
35  Elf32_Half     e_shstrndx;
36};
37
38// values for header->e_type
39enum e_type_values {
40  ET_NONE = 0,  // No file type
41  ET_REL = 1,  // Relocatable file
42  ET_EXEC = 2,  // Executable file
43  ET_DYN = 3,  // Shared object file
44  ET_CORE = 4,  // Core file
45  ET_LOPROC = 0xff00,  // Processor-specific
46  ET_HIPROC = 0xfff  // Processor-specific
47};
48
49// values for header->e_machine
50enum e_machine_values {
51  EM_NONE = 0,  // No machine
52  EM_386 = 3,  // Intel Architecture
53  EM_ARM = 40,  // ARM Architecture
54  EM_x86_64 = 62,  // Intel x86-64 Architecture
55  // Other values skipped
56};
57
58// A section header in the section header table
59struct Elf32_Shdr {
60  Elf32_Word   sh_name;
61  Elf32_Word   sh_type;
62  Elf32_Word   sh_flags;
63  Elf32_Addr   sh_addr;
64  Elf32_Off    sh_offset;
65  Elf32_Word   sh_size;
66  Elf32_Word   sh_link;
67  Elf32_Word   sh_info;
68  Elf32_Word   sh_addralign;
69  Elf32_Word   sh_entsize;
70};
71
72// Values for the section type field in a section header
73enum sh_type_values {
74  SHT_NULL = 0,
75  SHT_PROGBITS = 1,
76  SHT_SYMTAB = 2,
77  SHT_STRTAB = 3,
78  SHT_RELA = 4,
79  SHT_HASH = 5,
80  SHT_DYNAMIC = 6,
81  SHT_NOTE = 7,
82  SHT_NOBITS = 8,
83  SHT_REL = 9,
84  SHT_SHLIB = 10,
85  SHT_DYNSYM = 11,
86  SHT_INIT_ARRAY = 14,
87  SHT_FINI_ARRAY = 15,
88  SHT_LOPROC = 0x70000000,
89  SHT_HIPROC = 0x7fffffff,
90  SHT_LOUSER = 0x80000000,
91  SHT_HIUSER = 0xffffffff,
92};
93
94struct Elf32_Phdr {
95  Elf32_Word    p_type;
96  Elf32_Off     p_offset;
97  Elf32_Addr    p_vaddr;
98  Elf32_Addr    p_paddr;
99  Elf32_Word    p_filesz;
100  Elf32_Word    p_memsz;
101  Elf32_Word    p_flags;
102  Elf32_Word    p_align;
103};
104
105// Values for the segment type field in a program segment header
106enum ph_type_values {
107  PT_NULL = 0,
108  PT_LOAD = 1,
109  PT_DYNAMIC = 2,
110  PT_INTERP = 3,
111  PT_NOTE = 4,
112  PT_SHLIB = 5,
113  PT_PHDR = 6,
114  PT_LOPROC = 0x70000000,
115  PT_HIPROC = 0x7fffffff
116};
117
118struct Elf32_Rel {
119  Elf32_Addr    r_offset;
120  Elf32_Word    r_info;
121};
122
123struct Elf32_Rela {
124  Elf32_Addr    r_offset;
125  Elf32_Word    r_info;
126  Elf32_Sword   r_addend;
127};
128
129enum elf32_rel_386_type_values {
130  R_386_NONE = 0,
131  R_386_32 = 1,
132  R_386_PC32 = 2,
133  R_386_GOT32 = 3,
134  R_386_PLT32 = 4,
135  R_386_COPY = 5,
136  R_386_GLOB_DAT = 6,
137  R_386_JMP_SLOT = 7,
138  R_386_RELATIVE = 8,
139  R_386_GOTOFF = 9,
140  R_386_GOTPC = 10,
141  R_386_TLS_TPOFF = 14,
142};
143
144enum elf32_rel_arm_type_values {
145  R_ARM_RELATIVE = 23,
146};
147
148#endif  // COURGETTE_ELF_TYPES_H_
149