/root/src/xen/xen/include/xen/elfstructs.h
Line | Count | Source (jump to first uncovered line) |
1 | | #ifndef __XEN_ELFSTRUCTS_H__ |
2 | | #define __XEN_ELFSTRUCTS_H__ |
3 | | /* |
4 | | * Copyright (c) 1995, 1996 Erik Theisen. All rights reserved. |
5 | | * |
6 | | * Redistribution and use in source and binary forms, with or without |
7 | | * modification, are permitted provided that the following conditions |
8 | | * are met: |
9 | | * 1. Redistributions of source code must retain the above copyright |
10 | | * notice, this list of conditions and the following disclaimer. |
11 | | * 2. Redistributions in binary form must reproduce the above copyright |
12 | | * notice, this list of conditions and the following disclaimer in the |
13 | | * documentation and/or other materials provided with the distribution. |
14 | | * 3. The name of the author may not be used to endorse or promote products |
15 | | * derived from this software without specific prior written permission |
16 | | * |
17 | | * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
18 | | * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
19 | | * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
20 | | * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
21 | | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
22 | | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
23 | | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
24 | | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
25 | | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
26 | | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
27 | | */ |
28 | | |
29 | | typedef uint32_t Elf32_Addr; /* Unsigned program address */ |
30 | | typedef uint32_t Elf32_Off; /* Unsigned file offset */ |
31 | | typedef uint16_t Elf32_Half; /* Unsigned medium integer */ |
32 | | typedef int32_t Elf32_Sword; /* Signed large integer */ |
33 | | typedef uint32_t Elf32_Word; /* Unsigned large integer */ |
34 | | |
35 | | typedef uint64_t Elf64_Addr; |
36 | | typedef uint64_t Elf64_Off; |
37 | | typedef uint16_t Elf64_Half; |
38 | | typedef int32_t Elf64_Sword; |
39 | | typedef uint32_t Elf64_Word; |
40 | | typedef int64_t Elf64_Sxword; |
41 | | typedef uint64_t Elf64_Xword; |
42 | | |
43 | | /* Unique build id string format when using --build-id. */ |
44 | | #define NT_GNU_BUILD_ID 3 |
45 | | |
46 | | /* |
47 | | * e_ident[] identification indexes |
48 | | * See http://www.caldera.com/developers/gabi/2000-07-17/ch4.eheader.html |
49 | | */ |
50 | 3 | #define EI_MAG0 0 /* file ID */ |
51 | 3 | #define EI_MAG1 1 /* file ID */ |
52 | 3 | #define EI_MAG2 2 /* file ID */ |
53 | 3 | #define EI_MAG3 3 /* file ID */ |
54 | | #define EI_CLASS 4 /* file class */ |
55 | | #define EI_DATA 5 /* data encoding */ |
56 | | #define EI_VERSION 6 /* ELF header version */ |
57 | | #define EI_OSABI 7 /* OS/ABI ID */ |
58 | | #define EI_ABIVERSION 8 /* ABI version */ |
59 | | #define EI_PAD 9 /* start of pad bytes */ |
60 | | #define EI_NIDENT 16 /* Size of e_ident[] */ |
61 | | |
62 | | /* e_ident[] magic number */ |
63 | 3 | #define ELFMAG0 0x7f /* e_ident[EI_MAG0] */ |
64 | 3 | #define ELFMAG1 'E' /* e_ident[EI_MAG1] */ |
65 | 3 | #define ELFMAG2 'L' /* e_ident[EI_MAG2] */ |
66 | 3 | #define ELFMAG3 'F' /* e_ident[EI_MAG3] */ |
67 | | #define ELFMAG "\177ELF" /* magic */ |
68 | | #define SELFMAG 4 /* size of magic */ |
69 | | |
70 | | /* e_ident[] file class */ |
71 | | #define ELFCLASSNONE 0 /* invalid */ |
72 | | #define ELFCLASS32 1 /* 32-bit objs */ |
73 | 660 | #define ELFCLASS64 2 /* 64-bit objs */ |
74 | | #define ELFCLASSNUM 3 /* number of classes */ |
75 | | |
76 | | /* e_ident[] data encoding */ |
77 | | #define ELFDATANONE 0 /* invalid */ |
78 | 799 | #define ELFDATA2LSB 1 /* Little-Endian */ |
79 | | #define ELFDATA2MSB 2 /* Big-Endian */ |
80 | | #define ELFDATANUM 3 /* number of data encode defines */ |
81 | | |
82 | | /* e_ident[] Operating System/ABI */ |
83 | | #define ELFOSABI_SYSV 0 /* UNIX System V ABI */ |
84 | | #define ELFOSABI_NONE 0 /* Same as ELFOSABI_SYSV */ |
85 | | #define ELFOSABI_HPUX 1 /* HP-UX operating system */ |
86 | | #define ELFOSABI_NETBSD 2 /* NetBSD */ |
87 | | #define ELFOSABI_LINUX 3 /* GNU/Linux */ |
88 | | #define ELFOSABI_HURD 4 /* GNU/Hurd */ |
89 | | #define ELFOSABI_86OPEN 5 /* 86Open common IA32 ABI */ |
90 | | #define ELFOSABI_SOLARIS 6 /* Solaris */ |
91 | | #define ELFOSABI_MONTEREY 7 /* Monterey */ |
92 | | #define ELFOSABI_IRIX 8 /* IRIX */ |
93 | | #define ELFOSABI_FREEBSD 9 /* FreeBSD */ |
94 | | #define ELFOSABI_TRU64 10 /* TRU64 UNIX */ |
95 | | #define ELFOSABI_MODESTO 11 /* Novell Modesto */ |
96 | | #define ELFOSABI_OPENBSD 12 /* OpenBSD */ |
97 | | #define ELFOSABI_ARM 97 /* ARM */ |
98 | | #define ELFOSABI_STANDALONE 255 /* Standalone (embedded) application */ |
99 | | |
100 | | /* e_ident */ |
101 | 3 | #define IS_ELF(ehdr) ((ehdr).e_ident[EI_MAG0] == ELFMAG0 && \ |
102 | 3 | (ehdr).e_ident[EI_MAG1] == ELFMAG1 && \ |
103 | 3 | (ehdr).e_ident[EI_MAG2] == ELFMAG2 && \ |
104 | 3 | (ehdr).e_ident[EI_MAG3] == ELFMAG3) |
105 | | |
106 | | /* e_flags */ |
107 | | #define EF_ARM_EABI_MASK 0xff000000 |
108 | | #define EF_ARM_EABI_UNKNOWN 0x00000000 |
109 | | #define EF_ARM_EABI_VER1 0x01000000 |
110 | | #define EF_ARM_EABI_VER2 0x02000000 |
111 | | #define EF_ARM_EABI_VER3 0x03000000 |
112 | | #define EF_ARM_EABI_VER4 0x04000000 |
113 | | #define EF_ARM_EABI_VER5 0x05000000 |
114 | | |
115 | | /* ELF Header */ |
116 | | typedef struct elfhdr { |
117 | | unsigned char e_ident[EI_NIDENT]; /* ELF Identification */ |
118 | | Elf32_Half e_type; /* object file type */ |
119 | | Elf32_Half e_machine; /* machine */ |
120 | | Elf32_Word e_version; /* object file version */ |
121 | | Elf32_Addr e_entry; /* virtual entry point */ |
122 | | Elf32_Off e_phoff; /* program header table offset */ |
123 | | Elf32_Off e_shoff; /* section header table offset */ |
124 | | Elf32_Word e_flags; /* processor-specific flags */ |
125 | | Elf32_Half e_ehsize; /* ELF header size */ |
126 | | Elf32_Half e_phentsize; /* program header entry size */ |
127 | | Elf32_Half e_phnum; /* number of program header entries */ |
128 | | Elf32_Half e_shentsize; /* section header entry size */ |
129 | | Elf32_Half e_shnum; /* number of section header entries */ |
130 | | Elf32_Half e_shstrndx; /* section header table's "section |
131 | | header string table" entry offset */ |
132 | | } Elf32_Ehdr; |
133 | | |
134 | | typedef struct { |
135 | | unsigned char e_ident[EI_NIDENT]; /* Id bytes */ |
136 | | Elf64_Half e_type; /* file type */ |
137 | | Elf64_Half e_machine; /* machine type */ |
138 | | Elf64_Word e_version; /* version number */ |
139 | | Elf64_Addr e_entry; /* entry point */ |
140 | | Elf64_Off e_phoff; /* Program hdr offset */ |
141 | | Elf64_Off e_shoff; /* Section hdr offset */ |
142 | | Elf64_Word e_flags; /* Processor flags */ |
143 | | Elf64_Half e_ehsize; /* sizeof ehdr */ |
144 | | Elf64_Half e_phentsize; /* Program header entry size */ |
145 | | Elf64_Half e_phnum; /* Number of program headers */ |
146 | | Elf64_Half e_shentsize; /* Section header entry size */ |
147 | | Elf64_Half e_shnum; /* Number of section headers */ |
148 | | Elf64_Half e_shstrndx; /* String table index */ |
149 | | } Elf64_Ehdr; |
150 | | |
151 | | /* e_type */ |
152 | | #define ET_NONE 0 /* No file type */ |
153 | | #define ET_REL 1 /* relocatable file */ |
154 | | #define ET_EXEC 2 /* executable file */ |
155 | | #define ET_DYN 3 /* shared object file */ |
156 | | #define ET_CORE 4 /* core file */ |
157 | | #define ET_NUM 5 /* number of types */ |
158 | | #define ET_LOPROC 0xff00 /* reserved range for processor */ |
159 | | #define ET_HIPROC 0xffff /* specific e_type */ |
160 | | |
161 | | /* e_machine */ |
162 | 0 | #define EM_NONE 0 /* No Machine */ |
163 | | #define EM_M32 1 /* AT&T WE 32100 */ |
164 | | #define EM_SPARC 2 /* SPARC */ |
165 | 0 | #define EM_386 3 /* Intel 80386 */ |
166 | | #define EM_68K 4 /* Motorola 68000 */ |
167 | | #define EM_88K 5 /* Motorola 88000 */ |
168 | | #define EM_486 6 /* Intel 80486 - unused? */ |
169 | | #define EM_860 7 /* Intel 80860 */ |
170 | | #define EM_MIPS 8 /* MIPS R3000 Big-Endian only */ |
171 | | /* |
172 | | * Don't know if EM_MIPS_RS4_BE, |
173 | | * EM_SPARC64, EM_PARISC, |
174 | | * or EM_PPC are ABI compliant |
175 | | */ |
176 | | #define EM_MIPS_RS4_BE 10 /* MIPS R4000 Big-Endian */ |
177 | | #define EM_SPARC64 11 /* SPARC v9 64-bit unoffical */ |
178 | | #define EM_PARISC 15 /* HPPA */ |
179 | | #define EM_SPARC32PLUS 18 /* Enhanced instruction set SPARC */ |
180 | | #define EM_PPC 20 /* PowerPC */ |
181 | | #define EM_PPC64 21 /* PowerPC 64-bit */ |
182 | 1 | #define EM_ARM 40 /* Advanced RISC Machines ARM */ |
183 | | #define EM_ALPHA 41 /* DEC ALPHA */ |
184 | | #define EM_SPARCV9 43 /* SPARC version 9 */ |
185 | | #define EM_ALPHA_EXP 0x9026 /* DEC ALPHA */ |
186 | | #define EM_IA_64 50 /* Intel Merced */ |
187 | 0 | #define EM_X86_64 62 /* AMD x86-64 architecture */ |
188 | | #define EM_VAX 75 /* DEC VAX */ |
189 | | #define EM_AARCH64 183 /* ARM 64-bit */ |
190 | | |
191 | | /* Version */ |
192 | | #define EV_NONE 0 /* Invalid */ |
193 | | #define EV_CURRENT 1 /* Current */ |
194 | | #define EV_NUM 2 /* number of versions */ |
195 | | |
196 | | /* Section Header */ |
197 | | typedef struct { |
198 | | Elf32_Word sh_name; /* name - index into section header |
199 | | string table section */ |
200 | | Elf32_Word sh_type; /* type */ |
201 | | Elf32_Word sh_flags; /* flags */ |
202 | | Elf32_Addr sh_addr; /* address */ |
203 | | Elf32_Off sh_offset; /* file offset */ |
204 | | Elf32_Word sh_size; /* section size */ |
205 | | Elf32_Word sh_link; /* section header table index link */ |
206 | | Elf32_Word sh_info; /* extra information */ |
207 | | Elf32_Word sh_addralign; /* address alignment */ |
208 | | Elf32_Word sh_entsize; /* section entry size */ |
209 | | } Elf32_Shdr; |
210 | | |
211 | | typedef struct { |
212 | | Elf64_Word sh_name; /* section name */ |
213 | | Elf64_Word sh_type; /* section type */ |
214 | | Elf64_Xword sh_flags; /* section flags */ |
215 | | Elf64_Addr sh_addr; /* virtual address */ |
216 | | Elf64_Off sh_offset; /* file offset */ |
217 | | Elf64_Xword sh_size; /* section size */ |
218 | | Elf64_Word sh_link; /* link to another */ |
219 | | Elf64_Word sh_info; /* misc info */ |
220 | | Elf64_Xword sh_addralign; /* memory alignment */ |
221 | | Elf64_Xword sh_entsize; /* table entry size */ |
222 | | } Elf64_Shdr; |
223 | | |
224 | | /* Special Section Indexes */ |
225 | 1 | #define SHN_UNDEF 0 /* undefined */ |
226 | | #define SHN_LORESERVE 0xff00 /* lower bounds of reserved indexes */ |
227 | | #define SHN_LOPROC 0xff00 /* reserved range for processor */ |
228 | | #define SHN_HIPROC 0xff1f /* specific section indexes */ |
229 | | #define SHN_ABS 0xfff1 /* absolute value */ |
230 | | #define SHN_COMMON 0xfff2 /* common symbol */ |
231 | | #define SHN_HIRESERVE 0xffff /* upper bounds of reserved indexes */ |
232 | | |
233 | | /* sh_type */ |
234 | | #define SHT_NULL 0 /* inactive */ |
235 | | #define SHT_PROGBITS 1 /* program defined information */ |
236 | 48 | #define SHT_SYMTAB 2 /* symbol table section */ |
237 | 2 | #define SHT_STRTAB 3 /* string table section */ |
238 | | #define SHT_RELA 4 /* relocation section with addends*/ |
239 | | #define SHT_HASH 5 /* symbol hash table section */ |
240 | | #define SHT_DYNAMIC 6 /* dynamic section */ |
241 | 49 | #define SHT_NOTE 7 /* note section */ |
242 | | #define SHT_NOBITS 8 /* no space section */ |
243 | | #define SHT_REL 9 /* relation section without addends */ |
244 | | #define SHT_SHLIB 10 /* reserved - purpose unknown */ |
245 | | #define SHT_DYNSYM 11 /* dynamic symbol table section */ |
246 | | #define SHT_NUM 12 /* number of section types */ |
247 | | #define SHT_LOPROC 0x70000000 /* reserved range for processor */ |
248 | | #define SHT_HIPROC 0x7fffffff /* specific section header types */ |
249 | | #define SHT_LOUSER 0x80000000 /* reserved range for application */ |
250 | | #define SHT_HIUSER 0xffffffff /* specific indexes */ |
251 | | |
252 | | /* Section names */ |
253 | | #define ELF_BSS ".bss" /* uninitialized data */ |
254 | | #define ELF_DATA ".data" /* initialized data */ |
255 | | #define ELF_DEBUG ".debug" /* debug */ |
256 | | #define ELF_DYNAMIC ".dynamic" /* dynamic linking information */ |
257 | | #define ELF_DYNSTR ".dynstr" /* dynamic string table */ |
258 | | #define ELF_DYNSYM ".dynsym" /* dynamic symbol table */ |
259 | | #define ELF_FINI ".fini" /* termination code */ |
260 | | #define ELF_GOT ".got" /* global offset table */ |
261 | | #define ELF_HASH ".hash" /* symbol hash table */ |
262 | | #define ELF_INIT ".init" /* initialization code */ |
263 | | #define ELF_REL_DATA ".rel.data" /* relocation data */ |
264 | | #define ELF_REL_FINI ".rel.fini" /* relocation termination code */ |
265 | | #define ELF_REL_INIT ".rel.init" /* relocation initialization code */ |
266 | | #define ELF_REL_DYN ".rel.dyn" /* relocaltion dynamic link info */ |
267 | | #define ELF_REL_RODATA ".rel.rodata" /* relocation read-only data */ |
268 | | #define ELF_REL_TEXT ".rel.text" /* relocation code */ |
269 | | #define ELF_RODATA ".rodata" /* read-only data */ |
270 | | #define ELF_SHSTRTAB ".shstrtab" /* section header string table */ |
271 | | #define ELF_STRTAB ".strtab" /* string table */ |
272 | | #define ELF_SYMTAB ".symtab" /* symbol table */ |
273 | | #define ELF_TEXT ".text" /* code */ |
274 | | |
275 | | |
276 | | /* Section Attribute Flags - sh_flags */ |
277 | | #define SHF_WRITE 0x1 /* Writable */ |
278 | | #define SHF_ALLOC 0x2 /* occupies memory */ |
279 | | #define SHF_EXECINSTR 0x4 /* executable */ |
280 | | #define SHF_MERGE 0x10 /* mergeable */ |
281 | | #define SHF_MASKPROC 0xf0000000 /* reserved bits for processor */ |
282 | | /* specific section attributes */ |
283 | | |
284 | | /* Symbol Table Entry */ |
285 | | typedef struct elf32_sym { |
286 | | Elf32_Word st_name; /* name - index into string table */ |
287 | | Elf32_Addr st_value; /* symbol value */ |
288 | | Elf32_Word st_size; /* symbol size */ |
289 | | unsigned char st_info; /* type and binding */ |
290 | | unsigned char st_other; /* 0 - no defined meaning */ |
291 | | Elf32_Half st_shndx; /* section header index */ |
292 | | } Elf32_Sym; |
293 | | |
294 | | typedef struct { |
295 | | Elf64_Word st_name; /* Symbol name index in str table */ |
296 | | unsigned char st_info; /* type / binding attrs */ |
297 | | unsigned char st_other; /* unused */ |
298 | | Elf64_Half st_shndx; /* section index of symbol */ |
299 | | Elf64_Addr st_value; /* value of symbol */ |
300 | | Elf64_Xword st_size; /* size of symbol */ |
301 | | } Elf64_Sym; |
302 | | |
303 | | /* Symbol table index */ |
304 | | #define STN_UNDEF 0 /* undefined */ |
305 | | |
306 | | /* Extract symbol info - st_info */ |
307 | 0 | #define ELF32_ST_BIND(x) ((x) >> 4) |
308 | | #define ELF32_ST_TYPE(x) (((unsigned int) x) & 0xf) |
309 | | #define ELF32_ST_INFO(b,t) (((b) << 4) + ((t) & 0xf)) |
310 | | |
311 | | #define ELF64_ST_BIND(x) ((x) >> 4) |
312 | | #define ELF64_ST_TYPE(x) (((unsigned int) x) & 0xf) |
313 | | #define ELF64_ST_INFO(b,t) (((b) << 4) + ((t) & 0xf)) |
314 | | |
315 | | /* Symbol Binding - ELF32_ST_BIND - st_info */ |
316 | | #define STB_LOCAL 0 /* Local symbol */ |
317 | 0 | #define STB_GLOBAL 1 /* Global symbol */ |
318 | | #define STB_WEAK 2 /* like global - lower precedence */ |
319 | | #define STB_NUM 3 /* number of symbol bindings */ |
320 | | #define STB_LOPROC 13 /* reserved range for processor */ |
321 | | #define STB_HIPROC 15 /* specific symbol bindings */ |
322 | | |
323 | | /* Symbol type - ELF32_ST_TYPE - st_info */ |
324 | | #define STT_NOTYPE 0 /* not specified */ |
325 | | #define STT_OBJECT 1 /* data object */ |
326 | | #define STT_FUNC 2 /* function */ |
327 | | #define STT_SECTION 3 /* section */ |
328 | | #define STT_FILE 4 /* file */ |
329 | | #define STT_NUM 5 /* number of symbol types */ |
330 | | #define STT_LOPROC 13 /* reserved range for processor */ |
331 | | #define STT_HIPROC 15 /* specific symbol types */ |
332 | | |
333 | | /* Relocation entry with implicit addend */ |
334 | | typedef struct { |
335 | | Elf32_Addr r_offset; /* offset of relocation */ |
336 | | Elf32_Word r_info; /* symbol table index and type */ |
337 | | } Elf32_Rel; |
338 | | |
339 | | /* Relocation entry with explicit addend */ |
340 | | typedef struct { |
341 | | Elf32_Addr r_offset; /* offset of relocation */ |
342 | | Elf32_Word r_info; /* symbol table index and type */ |
343 | | Elf32_Sword r_addend; |
344 | | } Elf32_Rela; |
345 | | |
346 | | /* Extract relocation info - r_info */ |
347 | | #define ELF32_R_SYM(i) ((i) >> 8) |
348 | | #define ELF32_R_TYPE(i) ((unsigned char) (i)) |
349 | | #define ELF32_R_INFO(s,t) (((s) << 8) + (unsigned char)(t)) |
350 | | |
351 | | typedef struct { |
352 | | Elf64_Addr r_offset; /* where to do it */ |
353 | | Elf64_Xword r_info; /* index & type of relocation */ |
354 | | } Elf64_Rel; |
355 | | |
356 | | typedef struct { |
357 | | Elf64_Addr r_offset; /* where to do it */ |
358 | | Elf64_Xword r_info; /* index & type of relocation */ |
359 | | Elf64_Sxword r_addend; /* adjustment value */ |
360 | | } Elf64_Rela; |
361 | | |
362 | | #define ELF64_R_SYM(info) ((info) >> 32) |
363 | | #define ELF64_R_TYPE(info) ((info) & 0xFFFFFFFF) |
364 | | #define ELF64_R_INFO(s,t) (((s) << 32) + (uint32_t)(t)) |
365 | | |
366 | | /* |
367 | | * Relocation types for x86_64 and ARM 64. We list only the ones Live Patch |
368 | | * implements. |
369 | | */ |
370 | | #define R_X86_64_NONE 0 /* No reloc */ |
371 | | #define R_X86_64_64 1 /* Direct 64 bit */ |
372 | | #define R_X86_64_PC32 2 /* PC relative 32 bit signed */ |
373 | | #define R_X86_64_PLT32 4 /* 32 bit PLT address */ |
374 | | |
375 | | /* |
376 | | * ARM32 relocation types. See |
377 | | * http://infocenter.arm.com/help/topic/com.arm.doc.ihi0044f/IHI0044F_aaelf.pdf |
378 | | * S - address of symbol. |
379 | | * A - addend for relocation (r_addend or need to extract from insn) |
380 | | * P - address of the dest being relocated (derieved from r_offset) |
381 | | */ |
382 | | #define R_ARM_NONE 0 |
383 | | #define R_ARM_ABS32 2 /* Direct 32-bit. S+A */ |
384 | | #define R_ARM_REL32 3 /* PC relative. S+A */ |
385 | | #define R_ARM_CALL 28 /* SignExtend([23:0]) << 2. S+A-P */ |
386 | | #define R_ARM_JUMP24 29 /* Same as R_ARM_CALL */ |
387 | | #define R_ARM_MOVW_ABS_NC 43 /* SignExtend([19:16],[11:0])&0xFFFF, S+A */ |
388 | | #define R_ARM_MOVT_ABS 44 /* SignExtend([19:16],[11:0))&0xFFFF0000 */ |
389 | | /* >> 16, S+A. */ |
390 | | |
391 | | /* |
392 | | * NC - No check for overflow. |
393 | | * |
394 | | * The defines also use _PREL for PC-relative address, and _NC is No Check. |
395 | | */ |
396 | | #define R_AARCH64_ABS64 257 /* Direct 64 bit. S+A, NC*/ |
397 | | #define R_AARCH64_ABS32 258 /* Direct 32 bit. S+A */ |
398 | | #define R_AARCH64_ABS16 259 /* Direct 16 bit, S+A */ |
399 | | #define R_AARCH64_PREL64 260 /* S+A-P, NC */ |
400 | | #define R_AARCH64_PREL32 261 /* S+A-P */ |
401 | | #define R_AARCH64_PREL16 262 /* S+A-P */ |
402 | | |
403 | | /* Instructions. */ |
404 | | #define R_AARCH64_MOVW_UABS_G0 263 |
405 | | #define R_AARCH64_MOVW_UABS_G0_NC 264 |
406 | | #define R_AARCH64_MOVW_UABS_G1 265 |
407 | | #define R_AARCH64_MOVW_UABS_G1_NC 266 |
408 | | #define R_AARCH64_MOVW_UABS_G2 267 |
409 | | #define R_AARCH64_MOVW_UABS_G2_NC 268 |
410 | | #define R_AARCH64_MOVW_UABS_G3 269 |
411 | | |
412 | | #define R_AARCH64_MOVW_SABS_G0 270 |
413 | | #define R_AARCH64_MOVW_SABS_G1 271 |
414 | | #define R_AARCH64_MOVW_SABS_G2 272 |
415 | | |
416 | | #define R_AARCH64_ADR_PREL_LO21 274 /* ADR imm, [20:0]. S+A-P */ |
417 | | #define R_AARCH64_ADR_PREL_PG_HI21 275 /* ADRP imm, [32:12]. Page(S+A) - Page(P).*/ |
418 | | #define R_AARCH64_ADR_PREL_PG_HI21_NC 276 |
419 | | #define R_AARCH64_ADD_ABS_LO12_NC 277 /* ADD imm. [11:0]. S+A, NC */ |
420 | | |
421 | | #define R_AARCH64_TSTBR14 279 |
422 | | #define R_AARCH64_CONDBR19 280 /* Bits 20:2, S+A-P */ |
423 | | #define R_AARCH64_JUMP26 282 /* Bits 27:2, S+A-P */ |
424 | | #define R_AARCH64_CALL26 283 /* Bits 27:2, S+A-P */ |
425 | | #define R_AARCH64_LDST16_ABS_LO12_NC 284 /* LD/ST to bits 11:1, S+A, NC */ |
426 | | #define R_AARCH64_LDST32_ABS_LO12_NC 285 /* LD/ST to bits 11:2, S+A, NC */ |
427 | | #define R_AARCH64_LDST64_ABS_LO12_NC 286 /* LD/ST to bits 11:3, S+A, NC */ |
428 | | #define R_AARCH64_LDST8_ABS_LO12_NC 278 /* LD/ST to bits 11:0, S+A, NC */ |
429 | | #define R_AARCH64_LDST128_ABS_LO12_NC 299 |
430 | | |
431 | | #define R_AARCH64_MOVW_PREL_G0 287 |
432 | | #define R_AARCH64_MOVW_PREL_G0_NC 288 |
433 | | #define R_AARCH64_MOVW_PREL_G1 289 |
434 | | #define R_AARCH64_MOVW_PREL_G1_NC 290 |
435 | | #define R_AARCH64_MOVW_PREL_G2 291 |
436 | | #define R_AARCH64_MOVW_PREL_G2_NC 292 |
437 | | #define R_AARCH64_MOVW_PREL_G3 293 |
438 | | |
439 | | /* Program Header */ |
440 | | typedef struct { |
441 | | Elf32_Word p_type; /* segment type */ |
442 | | Elf32_Off p_offset; /* segment offset */ |
443 | | Elf32_Addr p_vaddr; /* virtual address of segment */ |
444 | | Elf32_Addr p_paddr; /* physical address - ignored? */ |
445 | | Elf32_Word p_filesz; /* number of bytes in file for seg. */ |
446 | | Elf32_Word p_memsz; /* number of bytes in mem. for seg. */ |
447 | | Elf32_Word p_flags; /* flags */ |
448 | | Elf32_Word p_align; /* memory alignment */ |
449 | | } Elf32_Phdr; |
450 | | |
451 | | typedef struct { |
452 | | Elf64_Word p_type; /* entry type */ |
453 | | Elf64_Word p_flags; /* flags */ |
454 | | Elf64_Off p_offset; /* offset */ |
455 | | Elf64_Addr p_vaddr; /* virtual address */ |
456 | | Elf64_Addr p_paddr; /* physical address */ |
457 | | Elf64_Xword p_filesz; /* file size */ |
458 | | Elf64_Xword p_memsz; /* memory size */ |
459 | | Elf64_Xword p_align; /* memory & file alignment */ |
460 | | } Elf64_Phdr; |
461 | | |
462 | | /* Segment types - p_type */ |
463 | | #define PT_NULL 0 /* unused */ |
464 | 12 | #define PT_LOAD 1 /* loadable segment */ |
465 | | #define PT_DYNAMIC 2 /* dynamic linking section */ |
466 | | #define PT_INTERP 3 /* the RTLD */ |
467 | 6 | #define PT_NOTE 4 /* auxiliary information */ |
468 | | #define PT_SHLIB 5 /* reserved - purpose undefined */ |
469 | | #define PT_PHDR 6 /* program header */ |
470 | | #define PT_NUM 7 /* Number of segment types */ |
471 | | #define PT_LOPROC 0x70000000 /* reserved range for processor */ |
472 | | #define PT_HIPROC 0x7fffffff /* specific segment types */ |
473 | | |
474 | | /* Segment flags - p_flags */ |
475 | 4 | #define PF_X 0x1 /* Executable */ |
476 | 4 | #define PF_W 0x2 /* Writable */ |
477 | 4 | #define PF_R 0x4 /* Readable */ |
478 | | #define PF_MASKPROC 0xf0000000 /* reserved bits for processor */ |
479 | | /* specific segment flags */ |
480 | | |
481 | | /* Dynamic structure */ |
482 | | typedef struct { |
483 | | Elf32_Sword d_tag; /* controls meaning of d_val */ |
484 | | union { |
485 | | Elf32_Word d_val; /* Multiple meanings - see d_tag */ |
486 | | Elf32_Addr d_ptr; /* program virtual address */ |
487 | | } d_un; |
488 | | } Elf32_Dyn; |
489 | | |
490 | | typedef struct { |
491 | | Elf64_Sxword d_tag; /* controls meaning of d_val */ |
492 | | union { |
493 | | Elf64_Xword d_val; |
494 | | Elf64_Addr d_ptr; |
495 | | } d_un; |
496 | | } Elf64_Dyn; |
497 | | |
498 | | /* Dynamic Array Tags - d_tag */ |
499 | | #define DT_NULL 0 /* marks end of _DYNAMIC array */ |
500 | | #define DT_NEEDED 1 /* string table offset of needed lib */ |
501 | | #define DT_PLTRELSZ 2 /* size of relocation entries in PLT */ |
502 | | #define DT_PLTGOT 3 /* address PLT/GOT */ |
503 | | #define DT_HASH 4 /* address of symbol hash table */ |
504 | | #define DT_STRTAB 5 /* address of string table */ |
505 | | #define DT_SYMTAB 6 /* address of symbol table */ |
506 | | #define DT_RELA 7 /* address of relocation table */ |
507 | | #define DT_RELASZ 8 /* size of relocation table */ |
508 | | #define DT_RELAENT 9 /* size of relocation entry */ |
509 | | #define DT_STRSZ 10 /* size of string table */ |
510 | | #define DT_SYMENT 11 /* size of symbol table entry */ |
511 | | #define DT_INIT 12 /* address of initialization func. */ |
512 | | #define DT_FINI 13 /* address of termination function */ |
513 | | #define DT_SONAME 14 /* string table offset of shared obj */ |
514 | | #define DT_RPATH 15 /* string table offset of library |
515 | | search path */ |
516 | | #define DT_SYMBOLIC 16 /* start sym search in shared obj. */ |
517 | | #define DT_REL 17 /* address of rel. tbl. w addends */ |
518 | | #define DT_RELSZ 18 /* size of DT_REL relocation table */ |
519 | | #define DT_RELENT 19 /* size of DT_REL relocation entry */ |
520 | | #define DT_PLTREL 20 /* PLT referenced relocation entry */ |
521 | | #define DT_DEBUG 21 /* bugger */ |
522 | | #define DT_TEXTREL 22 /* Allow rel. mod. to unwritable seg */ |
523 | | #define DT_JMPREL 23 /* add. of PLT's relocation entries */ |
524 | | #define DT_BIND_NOW 24 /* Bind now regardless of env setting */ |
525 | | #define DT_NUM 25 /* Number used. */ |
526 | | #define DT_LOPROC 0x70000000 /* reserved range for processor */ |
527 | | #define DT_HIPROC 0x7fffffff /* specific dynamic array tags */ |
528 | | |
529 | | /* Standard ELF hashing function */ |
530 | | unsigned int elf_hash(const unsigned char *name); |
531 | | |
532 | | /* |
533 | | * Note Definitions |
534 | | */ |
535 | | typedef struct { |
536 | | Elf32_Word namesz; |
537 | | Elf32_Word descsz; |
538 | | Elf32_Word type; |
539 | | } Elf32_Note; |
540 | | |
541 | | typedef struct { |
542 | | Elf64_Word namesz; |
543 | | Elf64_Word descsz; |
544 | | Elf64_Word type; |
545 | | } Elf64_Note; |
546 | | |
547 | | |
548 | | #if defined(ELFSIZE) |
549 | | #define CONCAT(x,y) __CONCAT(x,y) |
550 | | #define ELFNAME(x) CONCAT(elf,CONCAT(ELFSIZE,CONCAT(_,x))) |
551 | | #define ELFNAME2(x,y) CONCAT(x,CONCAT(_elf,CONCAT(ELFSIZE,CONCAT(_,y)))) |
552 | | #define ELFNAMEEND(x) CONCAT(x,CONCAT(_elf,ELFSIZE)) |
553 | | #define ELFDEFNNAME(x) CONCAT(ELF,CONCAT(ELFSIZE,CONCAT(_,x))) |
554 | | #endif |
555 | | |
556 | | #if defined(ELFSIZE) && (ELFSIZE == 32) |
557 | | #define PRIxElfAddr "08x" |
558 | | #define PRIuElfWord "8u" |
559 | | |
560 | | #define Elf_Ehdr Elf32_Ehdr |
561 | | #define Elf_Phdr Elf32_Phdr |
562 | | #define Elf_Shdr Elf32_Shdr |
563 | | #define Elf_Sym Elf32_Sym |
564 | | #define Elf_Rel Elf32_Rel |
565 | | #define Elf_RelA Elf32_Rela |
566 | | #define Elf_Dyn Elf32_Dyn |
567 | | #define Elf_Word Elf32_Word |
568 | | #define Elf_Sword Elf32_Sword |
569 | | #define Elf_Addr Elf32_Addr |
570 | | #define Elf_Off Elf32_Off |
571 | | #define Elf_Nhdr Elf32_Nhdr |
572 | | #define Elf_Note Elf32_Note |
573 | | |
574 | | #define ELF_R_SYM ELF32_R_SYM |
575 | | #define ELF_R_TYPE ELF32_R_TYPE |
576 | | #define ELF_R_INFO ELF32_R_INFO |
577 | | #define ELFCLASS ELFCLASS32 |
578 | | |
579 | | #define ELF_ST_BIND ELF32_ST_BIND |
580 | | #define ELF_ST_TYPE ELF32_ST_TYPE |
581 | | #define ELF_ST_INFO ELF32_ST_INFO |
582 | | |
583 | | #define AuxInfo Aux32Info |
584 | | #elif defined(ELFSIZE) && (ELFSIZE == 64) |
585 | | #define PRIxElfAddr PRIx64 |
586 | | #define PRIuElfWord PRIu64 |
587 | | |
588 | | #define Elf_Ehdr Elf64_Ehdr |
589 | | #define Elf_Phdr Elf64_Phdr |
590 | | #define Elf_Shdr Elf64_Shdr |
591 | | #define Elf_Sym Elf64_Sym |
592 | | #define Elf_Rel Elf64_Rel |
593 | | #define Elf_RelA Elf64_Rela |
594 | | #define Elf_Dyn Elf64_Dyn |
595 | | #define Elf_Word Elf64_Word |
596 | | #define Elf_Sword Elf64_Sword |
597 | | #define Elf_Addr Elf64_Addr |
598 | | #define Elf_Off Elf64_Off |
599 | | #define Elf_Nhdr Elf64_Nhdr |
600 | 0 | #define Elf_Note Elf64_Note |
601 | | |
602 | | #define ELF_R_SYM ELF64_R_SYM |
603 | | #define ELF_R_TYPE ELF64_R_TYPE |
604 | | #define ELF_R_INFO ELF64_R_INFO |
605 | | #define ELFCLASS ELFCLASS64 |
606 | | |
607 | | #define ELF_ST_BIND ELF64_ST_BIND |
608 | | #define ELF_ST_TYPE ELF64_ST_TYPE |
609 | | #define ELF_ST_INFO ELF64_ST_INFO |
610 | | |
611 | | #define AuxInfo Aux64Info |
612 | | #endif |
613 | | |
614 | | #endif /* __XEN_ELFSTRUCTS_H__ */ |