tlk: 6/19 update
[3rdparty/ote_partner/tlk.git] / include / kernel / exec_elf.h
1 /*      $NetBSD: exec_elf.h,v 1.126 2012/08/05 01:43:59 matt Exp $      */
2
3 /*-
4  * Copyright (c) 1994 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * This code is derived from software contributed to The NetBSD Foundation
8  * by Christos Zoulas.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29  * POSSIBILITY OF SUCH DAMAGE.
30  */
31
32 #ifndef _SYS_EXEC_ELF_H_
33 #define _SYS_EXEC_ELF_H_
34
35 /*
36  * The current ELF ABI specification is available at:
37  *      http://www.sco.com/developers/gabi/
38  *
39  * Current header definitions are in:
40  *      http://www.sco.com/developers/gabi/latest/ch4.eheader.html
41  */
42
43 #if defined(_KERNEL) || defined(_STANDALONE)
44 #include <sys/types.h>
45 #else
46 #include <inttypes.h>
47 #endif /* _KERNEL || _STANDALONE */
48
49 #if HAVE_NBTOOL_CONFIG_H
50 #include <nbinclude/machine/elf_machdep.h>
51 #else
52 #include <arch/elf_machdep.h>
53 #endif
54
55 typedef uint8_t         Elf_Byte;
56
57 typedef uint32_t        Elf32_Addr;
58 #define ELF32_FSZ_ADDR  4
59 typedef uint32_t        Elf32_Off;
60 typedef int32_t         Elf32_SOff;
61 #define ELF32_FSZ_OFF   4
62 typedef int32_t         Elf32_Sword;
63 #define ELF32_FSZ_SWORD 4
64 typedef uint32_t        Elf32_Word;
65 #define ELF32_FSZ_WORD  4
66 typedef uint16_t        Elf32_Half;
67 #define ELF32_FSZ_HALF  2
68 typedef uint64_t        Elf32_Lword;
69 #define ELF32_FSZ_LWORD 8
70
71 typedef uint64_t        Elf64_Addr;
72 #define ELF64_FSZ_ADDR  8
73 typedef uint64_t        Elf64_Off;
74 typedef int64_t         Elf64_SOff;
75 #define ELF64_FSZ_OFF   8
76 typedef int32_t         Elf64_Shalf;
77 #define ELF64_FSZ_SHALF 4
78
79 typedef int32_t         Elf64_Sword;
80 #define ELF64_FSZ_SWORD 4
81 typedef uint32_t        Elf64_Word;
82 #define ELF64_FSZ_WORD  4
83
84 typedef int64_t         Elf64_Sxword;
85 #define ELF64_FSZ_SXWORD 8
86 typedef uint64_t        Elf64_Xword;
87 #define ELF64_FSZ_XWORD 8
88 typedef uint64_t        Elf64_Lword;
89 #define ELF64_FSZ_LWORD 8
90 typedef uint16_t        Elf64_Half;
91 #define ELF64_FSZ_HALF 2
92
93 /*
94  * ELF Header
95  */
96 #define ELF_NIDENT      16
97
98 typedef struct {
99         unsigned char   e_ident[ELF_NIDENT];    /* Id bytes */
100         Elf32_Half      e_type;                 /* file type */
101         Elf32_Half      e_machine;              /* machine type */
102         Elf32_Word      e_version;              /* version number */
103         Elf32_Addr      e_entry;                /* entry point */
104         Elf32_Off       e_phoff;                /* Program hdr offset */
105         Elf32_Off       e_shoff;                /* Section hdr offset */
106         Elf32_Word      e_flags;                /* Processor flags */
107         Elf32_Half      e_ehsize;               /* sizeof ehdr */
108         Elf32_Half      e_phentsize;            /* Program header entry size */
109         Elf32_Half      e_phnum;                /* Number of program headers */
110         Elf32_Half      e_shentsize;            /* Section header entry size */
111         Elf32_Half      e_shnum;                /* Number of section headers */
112         Elf32_Half      e_shstrndx;             /* String table index */
113 } Elf32_Ehdr;
114
115 typedef struct {
116         unsigned char   e_ident[ELF_NIDENT];    /* Id bytes */
117         Elf64_Half      e_type;                 /* file type */
118         Elf64_Half      e_machine;              /* machine type */
119         Elf64_Word      e_version;              /* version number */
120         Elf64_Addr      e_entry;                /* entry point */
121         Elf64_Off       e_phoff;                /* Program hdr offset */
122         Elf64_Off       e_shoff;                /* Section hdr offset */
123         Elf64_Word      e_flags;                /* Processor flags */
124         Elf64_Half      e_ehsize;               /* sizeof ehdr */
125         Elf64_Half      e_phentsize;            /* Program header entry size */
126         Elf64_Half      e_phnum;                /* Number of program headers */
127         Elf64_Half      e_shentsize;            /* Section header entry size */
128         Elf64_Half      e_shnum;                /* Number of section headers */
129         Elf64_Half      e_shstrndx;             /* String table index */
130 } Elf64_Ehdr;
131
132 /* e_ident offsets */
133 #define EI_MAG0         0       /* '\177' */
134 #define EI_MAG1         1       /* 'E'    */
135 #define EI_MAG2         2       /* 'L'    */
136 #define EI_MAG3         3       /* 'F'    */
137 #define EI_CLASS        4       /* File class */
138 #define EI_DATA         5       /* Data encoding */
139 #define EI_VERSION      6       /* File version */
140 #define EI_OSABI        7       /* Operating system/ABI identification */
141 #define EI_ABIVERSION   8       /* ABI version */
142 #define EI_PAD          9       /* Start of padding bytes up to EI_NIDENT*/
143 #define EI_NIDENT       16      /* First non-ident header byte */
144
145 /* e_ident[EI_MAG0,EI_MAG3] */
146 #define ELFMAG0         0x7f
147 #define ELFMAG1         'E'
148 #define ELFMAG2         'L'
149 #define ELFMAG3         'F'
150 #define ELFMAG          "\177ELF"
151 #define SELFMAG         4
152
153 /* e_ident[EI_CLASS] */
154 #define ELFCLASSNONE    0       /* Invalid class */
155 #define ELFCLASS32      1       /* 32-bit objects */
156 #define ELFCLASS64      2       /* 64-bit objects */
157 #define ELFCLASSNUM     3
158
159 /* e_ident[EI_DATA] */
160 #define ELFDATANONE     0       /* Invalid data encoding */
161 #define ELFDATA2LSB     1       /* 2's complement values, LSB first */
162 #define ELFDATA2MSB     2       /* 2's complement values, MSB first */
163
164 /* e_ident[EI_VERSION] */
165 #define EV_NONE         0       /* Invalid version */
166 #define EV_CURRENT      1       /* Current version */
167 #define EV_NUM          2
168
169 /* e_ident[EI_OSABI] */
170 #define ELFOSABI_SYSV           0       /* UNIX System V ABI */
171 #define ELFOSABI_HPUX           1       /* HP-UX operating system */
172 #define ELFOSABI_NETBSD         2       /* NetBSD */
173 #define ELFOSABI_LINUX          3       /* GNU/Linux */
174 #define ELFOSABI_HURD           4       /* GNU/Hurd */
175 #define ELFOSABI_86OPEN         5       /* 86Open */
176 #define ELFOSABI_SOLARIS        6       /* Solaris */
177 #define ELFOSABI_MONTEREY       7       /* Monterey */
178 #define ELFOSABI_IRIX           8       /* IRIX */
179 #define ELFOSABI_FREEBSD        9       /* FreeBSD */
180 #define ELFOSABI_TRU64          10      /* TRU64 UNIX */
181 #define ELFOSABI_MODESTO        11      /* Novell Modesto */
182 #define ELFOSABI_OPENBSD        12      /* OpenBSD */
183 #define ELFOSABI_OPENVMS        13      /* OpenVMS */
184 #define ELFOSABI_NSK            14      /* HP Non-Stop Kernel */
185 #define ELFOSABI_AROS           15      /* Amiga Research OS */
186 /* Unofficial OSABIs follow */
187 #define ELFOSABI_ARM            97      /* ARM */
188 #define ELFOSABI_STANDALONE     255     /* Standalone (embedded) application */
189
190 #define ELFOSABI_NONE           ELFOSABI_SYSV
191 #define ELFOSABI_AIX            ELFOSABI_MONTEREY
192
193 /* e_type */
194 #define ET_NONE         0       /* No file type */
195 #define ET_REL          1       /* Relocatable file */
196 #define ET_EXEC         2       /* Executable file */
197 #define ET_DYN          3       /* Shared object file */
198 #define ET_CORE         4       /* Core file */
199 #define ET_NUM          5
200
201 #define ET_LOOS         0xfe00  /* Operating system specific range */
202 #define ET_HIOS         0xfeff
203 #define ET_LOPROC       0xff00  /* Processor-specific range */
204 #define ET_HIPROC       0xffff
205
206 /* e_machine */
207 #define EM_NONE         0       /* No machine */
208 #define EM_M32          1       /* AT&T WE 32100 */
209 #define EM_SPARC        2       /* SPARC */
210 #define EM_386          3       /* Intel 80386 */
211 #define EM_68K          4       /* Motorola 68000 */
212 #define EM_88K          5       /* Motorola 88000 */
213 #define EM_486          6       /* Intel 80486 */
214 #define EM_860          7       /* Intel 80860 */
215 #define EM_MIPS         8       /* MIPS I Architecture */
216 #define EM_S370         9       /* Amdahl UTS on System/370 */
217 #define EM_MIPS_RS3_LE  10      /* MIPS RS3000 Little-endian */
218                         /* 11-14 - Reserved */
219 #define EM_RS6000       11      /* IBM RS/6000 XXX reserved */
220 #define EM_PARISC       15      /* Hewlett-Packard PA-RISC */
221 #define EM_NCUBE        16      /* NCube XXX reserved */
222 #define EM_VPP500       17      /* Fujitsu VPP500 */
223 #define EM_SPARC32PLUS  18      /* Enhanced instruction set SPARC */
224 #define EM_960          19      /* Intel 80960 */
225 #define EM_PPC          20      /* PowerPC */
226 #define EM_PPC64        21      /* 64-bit PowerPC */
227                         /* 22-35 - Reserved */
228 #define EM_S390         22      /* System/390 XXX reserved */
229 #define EM_V800         36      /* NEC V800 */
230 #define EM_FR20         37      /* Fujitsu FR20 */
231 #define EM_RH32         38      /* TRW RH-32 */
232 #define EM_RCE          39      /* Motorola RCE */
233 #define EM_ARM          40      /* Advanced RISC Machines ARM */
234 #define EM_ALPHA        41      /* DIGITAL Alpha */
235 #define EM_SH           42      /* Hitachi Super-H */
236 #define EM_SPARCV9      43      /* SPARC Version 9 */
237 #define EM_TRICORE      44      /* Siemens Tricore */
238 #define EM_ARC          45      /* Argonaut RISC Core */
239 #define EM_H8_300       46      /* Hitachi H8/300 */
240 #define EM_H8_300H      47      /* Hitachi H8/300H */
241 #define EM_H8S          48      /* Hitachi H8S */
242 #define EM_H8_500       49      /* Hitachi H8/500 */
243 #define EM_IA_64        50      /* Intel Merced Processor */
244 #define EM_MIPS_X       51      /* Stanford MIPS-X */
245 #define EM_COLDFIRE     52      /* Motorola Coldfire */
246 #define EM_68HC12       53      /* Motorola MC68HC12 */
247 #define EM_MMA          54      /* Fujitsu MMA Multimedia Accelerator */
248 #define EM_PCP          55      /* Siemens PCP */
249 #define EM_NCPU         56      /* Sony nCPU embedded RISC processor */
250 #define EM_NDR1         57      /* Denso NDR1 microprocessor */
251 #define EM_STARCORE     58      /* Motorola Star*Core processor */
252 #define EM_ME16         59      /* Toyota ME16 processor */
253 #define EM_ST100        60      /* STMicroelectronics ST100 processor */
254 #define EM_TINYJ        61      /* Advanced Logic Corp. TinyJ embedded family processor */
255 #define EM_X86_64       62      /* AMD x86-64 architecture */
256 #define EM_PDSP         63      /* Sony DSP Processor */
257 #define EM_PDP10        64      /* Digital Equipment Corp. PDP-10 */
258 #define EM_PDP11        65      /* Digital Equipment Corp. PDP-11 */
259 #define EM_FX66         66      /* Siemens FX66 microcontroller */
260 #define EM_ST9PLUS      67      /* STMicroelectronics ST9+ 8/16 bit microcontroller */
261 #define EM_ST7          68      /* STMicroelectronics ST7 8-bit microcontroller */
262 #define EM_68HC16       69      /* Motorola MC68HC16 Microcontroller */
263 #define EM_68HC11       70      /* Motorola MC68HC11 Microcontroller */
264 #define EM_68HC08       71      /* Motorola MC68HC08 Microcontroller */
265 #define EM_68HC05       72      /* Motorola MC68HC05 Microcontroller */
266 #define EM_SVX          73      /* Silicon Graphics SVx */
267 #define EM_ST19         74      /* STMicroelectronics ST19 8-bit CPU */
268 #define EM_VAX          75      /* Digital VAX */
269 #define EM_CRIS         76      /* Axis Communications 32-bit embedded processor */
270 #define EM_JAVELIN      77      /* Infineon Technologies 32-bit embedded CPU */
271 #define EM_FIREPATH     78      /* Element 14 64-bit DSP processor */
272 #define EM_ZSP          79      /* LSI Logic's 16-bit DSP processor */
273 #define EM_MMIX         80      /* Donald Knuth's educational 64-bit processor */
274 #define EM_HUANY        81      /* Harvard's machine-independent format */
275 #define EM_PRISM        82      /* SiTera Prism */
276 #define EM_AVR          83      /* Atmel AVR 8-bit microcontroller */
277 #define EM_FR30         84      /* Fujitsu FR30 */
278 #define EM_D10V         85      /* Mitsubishi D10V */
279 #define EM_D30V         86      /* Mitsubishi D30V */
280 #define EM_V850         87      /* NEC v850 */
281 #define EM_M32R         88      /* Mitsubishi M32R */
282 #define EM_MN10300      89      /* Matsushita MN10300 */
283 #define EM_MN10200      90      /* Matsushita MN10200 */
284 #define EM_PJ           91      /* picoJava */
285 #define EM_OPENRISC     92      /* OpenRISC 32-bit embedded processor */
286 #define EM_ARC_A5       93      /* ARC Cores Tangent-A5 */
287 #define EM_XTENSA       94      /* Tensilica Xtensa Architecture */
288 #define EM_VIDEOCORE    95      /* Alphamosaic VideoCore processor */
289 #define EM_TMM_GPP      96      /* Thompson Multimedia General Purpose Processor */
290 #define EM_NS32K        97      /* National Semiconductor 32000 series */
291 #define EM_TPC          98      /* Tenor Network TPC processor */
292 #define EM_SNP1K        99      /* Trebia SNP 1000 processor */
293 #define EM_ST200        100     /* STMicroelectronics ST200 microcontroller */
294 #define EM_IP2K         101     /* Ubicom IP2xxx microcontroller family */
295 #define EM_MAX          102     /* MAX processor */
296 #define EM_CR           103     /* National Semiconductor CompactRISC micorprocessor */
297 #define EM_F2MC16       104     /* Fujitsu F2MC16 */
298 #define EM_MSP430       105     /* Texas Instruments MSP430 */
299 #define EM_BLACKFIN     106     /* Analog Devices Blackfin DSP */
300 #define EM_SE_C33       107     /* Seiko Epson S1C33 family */
301 #define EM_SEP          108     /* Sharp embedded microprocessor */
302 #define EM_ARCA         109     /* Arca RISC microprocessor */
303 #define EM_UNICORE      110     /* UNICORE from PKU-Unity Ltd. and MPRC Peking University */
304
305 /* Unofficial machine types follow */
306 #define EM_AVR32        6317    /* used by NetBSD/avr32 */
307 #define EM_ALPHA_EXP    36902   /* used by NetBSD/alpha; obsolete */
308 #define EM_NUM          36903
309
310 /*
311  * Program Header
312  */
313 typedef struct {
314         Elf32_Word      p_type;         /* entry type */
315         Elf32_Off       p_offset;       /* offset */
316         Elf32_Addr      p_vaddr;        /* virtual address */
317         Elf32_Addr      p_paddr;        /* physical address */
318         Elf32_Word      p_filesz;       /* file size */
319         Elf32_Word      p_memsz;        /* memory size */
320         Elf32_Word      p_flags;        /* flags */
321         Elf32_Word      p_align;        /* memory & file alignment */
322 } Elf32_Phdr;
323
324 typedef struct {
325         Elf64_Word      p_type;         /* entry type */
326         Elf64_Word      p_flags;        /* flags */
327         Elf64_Off       p_offset;       /* offset */
328         Elf64_Addr      p_vaddr;        /* virtual address */
329         Elf64_Addr      p_paddr;        /* physical address */
330         Elf64_Xword     p_filesz;       /* file size */
331         Elf64_Xword     p_memsz;        /* memory size */
332         Elf64_Xword     p_align;        /* memory & file alignment */
333 } Elf64_Phdr;
334
335 /* p_type */
336 #define PT_NULL         0               /* Program header table entry unused */
337 #define PT_LOAD         1               /* Loadable program segment */
338 #define PT_DYNAMIC      2               /* Dynamic linking information */
339 #define PT_INTERP       3               /* Program interpreter */
340 #define PT_NOTE         4               /* Auxiliary information */
341 #define PT_SHLIB        5               /* Reserved, unspecified semantics */
342 #define PT_PHDR         6               /* Entry for header table itself */
343 #define PT_TLS          7               /* TLS initialisation image */
344 #define PT_NUM          8
345
346 #define PT_LOOS         0x60000000      /* OS-specific range */
347
348 /* GNU-specific */
349 #define PT_GNU_EH_FRAME 0x6474e550      /* EH frame segment */
350 #define PT_GNU_STACK    0x6474e551      /* Indicate executable stack */
351 #define PT_GNU_RELRO    0x6474e552      /* Make read-only after relocation */
352
353 #define PT_HIOS         0x6fffffff
354 #define PT_LOPROC       0x70000000      /* Processor-specific range */
355 #define PT_HIPROC       0x7fffffff
356
357 #define PT_MIPS_REGINFO 0x70000000
358
359 /* p_flags */
360 #define PF_R            0x4             /* Segment is readable */
361 #define PF_W            0x2             /* Segment is writable */
362 #define PF_X            0x1             /* Segment is executable */
363
364 #define PF_MASKOS       0x0ff00000      /* Operating system specific values */
365 #define PF_MASKPROC     0xf0000000      /* Processor-specific values */
366
367 /* Extended program header index. */
368 #define PN_XNUM         0xffff
369
370 /*
371  * Section Headers
372  */
373 typedef struct {
374         Elf32_Word      sh_name;        /* section name (.shstrtab index) */
375         Elf32_Word      sh_type;        /* section type */
376         Elf32_Word      sh_flags;       /* section flags */
377         Elf32_Addr      sh_addr;        /* virtual address */
378         Elf32_Off       sh_offset;      /* file offset */
379         Elf32_Word      sh_size;        /* section size */
380         Elf32_Word      sh_link;        /* link to another */
381         Elf32_Word      sh_info;        /* misc info */
382         Elf32_Word      sh_addralign;   /* memory alignment */
383         Elf32_Word      sh_entsize;     /* table entry size */
384 } Elf32_Shdr;
385
386 typedef struct {
387         Elf64_Word      sh_name;        /* section name (.shstrtab index) */
388         Elf64_Word      sh_type;        /* section type */
389         Elf64_Xword     sh_flags;       /* section flags */
390         Elf64_Addr      sh_addr;        /* virtual address */
391         Elf64_Off       sh_offset;      /* file offset */
392         Elf64_Xword     sh_size;        /* section size */
393         Elf64_Word      sh_link;        /* link to another */
394         Elf64_Word      sh_info;        /* misc info */
395         Elf64_Xword     sh_addralign;   /* memory alignment */
396         Elf64_Xword     sh_entsize;     /* table entry size */
397 } Elf64_Shdr;
398
399 /* sh_type */
400 #define SHT_NULL              0         /* Section header table entry unused */
401 #define SHT_PROGBITS          1         /* Program information */
402 #define SHT_SYMTAB            2         /* Symbol table */
403 #define SHT_STRTAB            3         /* String table */
404 #define SHT_RELA              4         /* Relocation information w/ addend */
405 #define SHT_HASH              5         /* Symbol hash table */
406 #define SHT_DYNAMIC           6         /* Dynamic linking information */
407 #define SHT_NOTE              7         /* Auxiliary information */
408 #define SHT_NOBITS            8         /* No space allocated in file image */
409 #define SHT_REL               9         /* Relocation information w/o addend */
410 #define SHT_SHLIB            10         /* Reserved, unspecified semantics */
411 #define SHT_DYNSYM           11         /* Symbol table for dynamic linker */
412 #define SHT_INIT_ARRAY       14         /* Initialization function pointers */
413 #define SHT_FINI_ARRAY       15         /* Termination function pointers */
414 #define SHT_PREINIT_ARRAY    16         /* Pre-initialization function ptrs */
415 #define SHT_GROUP            17         /* Section group */
416 #define SHT_SYMTAB_SHNDX     18         /* Section indexes (see SHN_XINDEX) */
417 #define SHT_NUM              19
418
419 #define SHT_LOOS             0x60000000 /* Operating system specific range */
420 #define SHT_GNU_HASH         0x6ffffff6 /* GNU style symbol hash table */
421 #define SHT_SUNW_move        0x6ffffffa
422 #define SHT_SUNW_syminfo     0x6ffffffc
423 #define SHT_SUNW_verdef      0x6ffffffd /* Versions defined by file */
424 #define SHT_GNU_verdef       SHT_SUNW_verdef
425 #define SHT_SUNW_verneed     0x6ffffffe /* Versions needed by file */
426 #define SHT_GNU_verneed      SHT_SUNW_verneed
427 #define SHT_SUNW_versym      0x6fffffff /* Symbol versions */
428 #define SHT_GNU_versym       SHT_SUNW_versym
429 #define SHT_HIOS             0x6fffffff
430 #define SHT_LOPROC           0x70000000 /* Processor-specific range */
431 #define SHT_AMD64_UNWIND     0x70000001 /* unwind information */
432 #define SHT_HIPROC           0x7fffffff
433 #define SHT_LOUSER           0x80000000 /* Application-specific range */
434 #define SHT_HIUSER           0xffffffff
435
436 /* sh_flags */
437 #define SHF_WRITE            0x00000001 /* Contains writable data */
438 #define SHF_ALLOC            0x00000002 /* Occupies memory */
439 #define SHF_EXECINSTR        0x00000004 /* Contains executable insns */
440 #define SHF_MERGE            0x00000010 /* Might be merged */
441 #define SHF_STRINGS          0x00000020 /* Contains nul terminated strings */
442 #define SHF_INFO_LINK        0x00000040 /* "sh_info" contains SHT index */
443 #define SHF_LINK_ORDER       0x00000080 /* Preserve order after combining */
444 #define SHF_OS_NONCONFORMING 0x00000100 /* OS specific handling required */
445 #define SHF_GROUP            0x00000200 /* Is member of a group */
446 #define SHF_TLS              0x00000400 /* Holds thread-local data */
447 #define SHF_MASKOS           0x0ff00000 /* Operating system specific values */
448 #define SHF_MASKPROC         0xf0000000 /* Processor-specific values */
449 #define SHF_ORDERED          0x40000000 /* Ordering requirement (Solaris) */
450 #define SHF_EXCLUDE          0x80000000 /* Excluded unless unles ref/alloc
451                                            (Solaris).*/
452 /*
453  * Symbol Table
454  */
455 typedef struct {
456         Elf32_Word      st_name;        /* Symbol name (.strtab index) */
457         Elf32_Word      st_value;       /* value of symbol */
458         Elf32_Word      st_size;        /* size of symbol */
459         Elf_Byte        st_info;        /* type / binding attrs */
460         Elf_Byte        st_other;       /* unused */
461         Elf32_Half      st_shndx;       /* section index of symbol */
462 } Elf32_Sym;
463
464 typedef struct {
465         Elf64_Word      st_name;        /* Symbol name (.strtab index) */
466         Elf_Byte        st_info;        /* type / binding attrs */
467         Elf_Byte        st_other;       /* unused */
468         Elf64_Half      st_shndx;       /* section index of symbol */
469         Elf64_Addr      st_value;       /* value of symbol */
470         Elf64_Xword     st_size;        /* size of symbol */
471 } Elf64_Sym;
472
473 /* Symbol Table index of the undefined symbol */
474 #define ELF_SYM_UNDEFINED       0
475
476 #define STN_UNDEF               0       /* undefined index */
477
478 /* st_info: Symbol Bindings */
479 #define STB_LOCAL               0       /* local symbol */
480 #define STB_GLOBAL              1       /* global symbol */
481 #define STB_WEAK                2       /* weakly defined global symbol */
482 #define STB_NUM                 3
483
484 #define STB_LOOS                10      /* Operating system specific range */
485 #define STB_HIOS                12
486 #define STB_LOPROC              13      /* Processor-specific range */
487 #define STB_HIPROC              15
488
489 /* st_info: Symbol Types */
490 #define STT_NOTYPE              0       /* Type not specified */
491 #define STT_OBJECT              1       /* Associated with a data object */
492 #define STT_FUNC                2       /* Associated with a function */
493 #define STT_SECTION             3       /* Associated with a section */
494 #define STT_FILE                4       /* Associated with a file name */
495 #define STT_COMMON              5       /* Uninitialised common block */
496 #define STT_TLS                 6       /* Thread local data object */
497 #define STT_NUM                 7
498
499 #define STT_LOOS                10      /* Operating system specific range */
500 #define STT_HIOS                12
501 #define STT_LOPROC              13      /* Processor-specific range */
502 #define STT_HIPROC              15
503
504 /* st_other: Visibility Types */
505 #define STV_DEFAULT             0       /* use binding type */
506 #define STV_INTERNAL            1       /* not referenced from outside */
507 #define STV_HIDDEN              2       /* not visible, may be used via ptr */
508 #define STV_PROTECTED           3       /* visible, not preemptible */
509 #define STV_EXPORTED            4
510 #define STV_SINGLETON           5
511 #define STV_ELIMINATE           6
512
513 /* st_info/st_other utility macros */
514 #define ELF_ST_BIND(info)               ((uint32_t)(info) >> 4)
515 #define ELF_ST_TYPE(info)               ((uint32_t)(info) & 0xf)
516 #define ELF_ST_INFO(bind,type)          ((Elf_Byte)(((bind) << 4) | \
517                                          ((type) & 0xf)))
518 #define ELF_ST_VISIBILITY(other)        ((uint32_t)(other) & 3)
519
520 /*
521  * Special section indexes
522  */
523 #define SHN_UNDEF       0               /* Undefined section */
524
525 #define SHN_LORESERVE   0xff00          /* Reserved range */
526 #define SHN_ABS         0xfff1          /*  Absolute symbols */
527 #define SHN_COMMON      0xfff2          /*  Common symbols */
528 #define SHN_XINDEX      0xffff          /* Escape -- index stored elsewhere */
529 #define SHN_HIRESERVE   0xffff
530
531 #define SHN_LOPROC      0xff00          /* Processor-specific range */
532 #define SHN_HIPROC      0xff1f
533 #define SHN_LOOS        0xff20          /* Operating system specific range */
534 #define SHN_HIOS        0xff3f
535
536 #define SHN_MIPS_ACOMMON 0xff00
537 #define SHN_MIPS_TEXT   0xff01
538 #define SHN_MIPS_DATA   0xff02
539 #define SHN_MIPS_SCOMMON 0xff03
540
541 /*
542  * Relocation Entries
543  */
544 typedef struct {
545         Elf32_Word      r_offset;       /* where to do it */
546         Elf32_Word      r_info;         /* index & type of relocation */
547 } Elf32_Rel;
548
549 typedef struct {
550         Elf32_Word      r_offset;       /* where to do it */
551         Elf32_Word      r_info;         /* index & type of relocation */
552         Elf32_Sword     r_addend;       /* adjustment value */
553 } Elf32_Rela;
554
555 /* r_info utility macros */
556 #define ELF32_R_SYM(info)       ((info) >> 8)
557 #define ELF32_R_TYPE(info)      ((info) & 0xff)
558 #define ELF32_R_INFO(sym, type) (((sym) << 8) + (unsigned char)(type))
559
560 typedef struct {
561         Elf64_Addr      r_offset;       /* where to do it */
562         Elf64_Xword     r_info;         /* index & type of relocation */
563 } Elf64_Rel;
564
565 typedef struct {
566         Elf64_Addr      r_offset;       /* where to do it */
567         Elf64_Xword     r_info;         /* index & type of relocation */
568         Elf64_Sxword    r_addend;       /* adjustment value */
569 } Elf64_Rela;
570
571 /* r_info utility macros */
572 #define ELF64_R_SYM(info)       ((info) >> 32)
573 #define ELF64_R_TYPE(info)      ((info) & 0xffffffff)
574 #define ELF64_R_INFO(sym,type)  (((sym) << 32) + (type))
575
576 /*
577  * Move entries
578  */
579 typedef struct {
580         Elf32_Lword     m_value;        /* symbol value */
581         Elf32_Word      m_info;         /* size + index */
582         Elf32_Word      m_poffset;      /* symbol offset */
583         Elf32_Half      m_repeat;       /* repeat count */
584         Elf32_Half      m_stride;       /* stride info */
585 } Elf32_Move;
586
587 #define ELF32_M_SYM(info)       ((info) >> 8)
588 #define ELF32_M_SIZE(info)      ((info) & 0xff)
589 #define ELF32_M_INFO(sym, size) (((sym) << 8) + (unsigned char)(size))
590
591 typedef struct {
592         Elf64_Lword     m_value;        /* symbol value */
593         Elf64_Xword     m_info;         /* size + index */
594         Elf64_Xword     m_poffset;      /* symbol offset */
595         Elf64_Word      m_repeat;       /* repeat count */
596         Elf64_Word      m_stride;       /* stride info */
597 } Elf64_Move;
598
599 #define ELF64_M_SYM(info)       ((info) >> 8)
600 #define ELF64_M_SIZE(info)      ((info) & 0xff)
601 #define ELF64_M_INFO(sym, size) (((sym) << 8) + (unsigned char)(size))
602
603 /*
604  * Hardware/software capabilities entry
605  */
606 typedef struct {
607         Elf32_Word              c_tag;  /* entry tag value */
608         union {
609                 Elf32_Addr      c_ptr;
610                 Elf32_Word      c_val;
611         } c_un;
612 } Elf32_Cap;
613
614 typedef struct {
615         Elf64_Xword             c_tag;  /* entry tag value */
616         union {
617                 Elf64_Addr      c_ptr;
618                 Elf64_Xword     c_val;
619         } c_un;
620 } Elf64_Cap;
621
622 /*
623  * Dynamic Section structure array
624  */
625 typedef struct {
626         Elf32_Word              d_tag;  /* entry tag value */
627         union {
628                 Elf32_Addr      d_ptr;
629                 Elf32_Word      d_val;
630         } d_un;
631 } Elf32_Dyn;
632
633 typedef struct {
634         Elf64_Xword             d_tag;  /* entry tag value */
635         union {
636                 Elf64_Addr      d_ptr;
637                 Elf64_Xword     d_val;
638         } d_un;
639 } Elf64_Dyn;
640
641 /* d_tag */
642 #define DT_NULL         0       /* Marks end of dynamic array */
643 #define DT_NEEDED       1       /* Name of needed library (DT_STRTAB offset) */
644 #define DT_PLTRELSZ     2       /* Size, in bytes, of relocations in PLT */
645 #define DT_PLTGOT       3       /* Address of PLT and/or GOT */
646 #define DT_HASH         4       /* Address of symbol hash table */
647 #define DT_STRTAB       5       /* Address of string table */
648 #define DT_SYMTAB       6       /* Address of symbol table */
649 #define DT_RELA         7       /* Address of Rela relocation table */
650 #define DT_RELASZ       8       /* Size, in bytes, of DT_RELA table */
651 #define DT_RELAENT      9       /* Size, in bytes, of one DT_RELA entry */
652 #define DT_STRSZ        10      /* Size, in bytes, of DT_STRTAB table */
653 #define DT_SYMENT       11      /* Size, in bytes, of one DT_SYMTAB entry */
654 #define DT_INIT         12      /* Address of initialization function */
655 #define DT_FINI         13      /* Address of termination function */
656 #define DT_SONAME       14      /* Shared object name (DT_STRTAB offset) */
657 #define DT_RPATH        15      /* Library search path (DT_STRTAB offset) */
658 #define DT_SYMBOLIC     16      /* Start symbol search within local object */
659 #define DT_REL          17      /* Address of Rel relocation table */
660 #define DT_RELSZ        18      /* Size, in bytes, of DT_REL table */
661 #define DT_RELENT       19      /* Size, in bytes, of one DT_REL entry */
662 #define DT_PLTREL       20      /* Type of PLT relocation entries */
663 #define DT_DEBUG        21      /* Used for debugging; unspecified */
664 #define DT_TEXTREL      22      /* Relocations might modify non-writable seg */
665 #define DT_JMPREL       23      /* Address of relocations associated with PLT */
666 #define DT_BIND_NOW     24      /* Process all relocations at load-time */
667 #define DT_INIT_ARRAY   25      /* Address of initialization function array */
668 #define DT_FINI_ARRAY   26      /* Size, in bytes, of DT_INIT_ARRAY array */
669 #define DT_INIT_ARRAYSZ 27      /* Address of termination function array */
670 #define DT_FINI_ARRAYSZ 28      /* Size, in bytes, of DT_FINI_ARRAY array*/
671 #define DT_NUM          29
672
673 #define DT_LOOS         0x60000000      /* Operating system specific range */
674 #define DT_VERSYM       0x6ffffff0      /* Symbol versions */
675 #define DT_FLAGS_1      0x6ffffffb      /* ELF dynamic flags */
676 #define DT_VERDEF       0x6ffffffc      /* Versions defined by file */
677 #define DT_VERDEFNUM    0x6ffffffd      /* Number of versions defined by file */
678 #define DT_VERNEED      0x6ffffffe      /* Versions needed by file */
679 #define DT_VERNEEDNUM   0x6fffffff      /* Number of versions needed by file */
680 #define DT_HIOS         0x6fffffff
681 #define DT_LOPROC       0x70000000      /* Processor-specific range */
682 #define DT_HIPROC       0x7fffffff
683
684 /* Flag values for DT_FLAGS_1 (incomplete) */
685 #define DF_1_BIND_NOW   0x00000001      /* Same as DF_BIND_NOW */
686 #define DF_1_NODELETE   0x00000008      /* Set the RTLD_NODELETE for object */
687 #define DF_1_INITFIRST  0x00000020      /* Object's init/fini take priority */
688 #define DF_1_NOOPEN     0x00000040      /* Do not allow loading on dlopen() */
689
690 /*
691  * Auxiliary Vectors
692  */
693 typedef struct {
694         Elf32_Word      a_type;                         /* 32-bit id */
695         Elf32_Word      a_v;                            /* 32-bit id */
696 } Aux32Info;
697
698 typedef struct {
699         Elf64_Word      a_type;         /* 32-bit id */
700         Elf64_Xword     a_v;            /* 64-bit id */
701 } Aux64Info;
702
703 /* BEGIN android-changed: these constants should come from <linux/auxvec.h>. */
704 #if 1
705 /* a_type */
706 #define AT_NULL         0       /* Marks end of array */
707 #define AT_IGNORE       1       /* No meaning, a_un is undefined */
708 #define AT_EXECFD       2       /* Open file descriptor of object file */
709 #define AT_PHDR         3       /* &phdr[0] */
710 #define AT_PHENT        4       /* sizeof(phdr[0]) */
711 #define AT_PHNUM        5       /* # phdr entries */
712 #define AT_PAGESZ       6       /* PAGESIZE */
713 #define AT_BASE         7       /* Interpreter base addr */
714 #define AT_FLAGS        8       /* Processor flags */
715 #define AT_ENTRY        9       /* Entry address of executable */
716 #define AT_DCACHEBSIZE  10      /* Data cache block size */
717 #define AT_ICACHEBSIZE  11      /* Instruction cache block size */
718 #define AT_UCACHEBSIZE  12      /* Unified cache block size */
719 #define AT_STACKBASE    13      /* Base address of the main thread */
720
721 #define AT_RANDOM       25
722
723         /* Vendor specific */
724 #define AT_MIPS_NOTELF  10      /* XXX a_val != 0 -> MIPS XCOFF executable */
725
726 #define AT_EUID         2000    /* euid (solaris compatible numbers) */
727 #define AT_RUID         2001    /* ruid (solaris compatible numbers) */
728 #define AT_EGID         2002    /* egid (solaris compatible numbers) */
729 #define AT_RGID         2003    /* rgid (solaris compatible numbers) */
730
731         /* Solaris kernel specific */
732 #define AT_SUN_LDELF    2004    /* dynamic linker's ELF header */
733 #define AT_SUN_LDSHDR   2005    /* dynamic linker's section header */
734 #define AT_SUN_LDNAME   2006    /* dynamic linker's name */
735 #define AT_SUN_LPGSIZE  2007    /* large pagesize */
736
737         /* Other information */
738 #define AT_SUN_PLATFORM 2008    /* sysinfo(SI_PLATFORM) */
739 #define AT_SUN_HWCAP    2009    /* process hardware capabilities */
740 #define AT_SUN_IFLUSH   2010    /* do we need to flush the instruction cache? */
741 #define AT_SUN_CPU      2011    /* CPU name */
742         /* ibcs2 emulation band aid */
743 #define AT_SUN_EMUL_ENTRY 2012  /* coff entry point */
744 #define AT_SUN_EMUL_EXECFD 2013 /* coff file descriptor */
745         /* Executable's fully resolved name */
746 #define AT_SUN_EXECNAME 2014
747 #endif
748 /* END android-changed */
749
750 /*
751  * Note Headers
752  */
753 typedef struct {
754         Elf32_Word n_namesz;
755         Elf32_Word n_descsz;
756         Elf32_Word n_type;
757 } Elf32_Nhdr;
758
759 typedef struct {
760         Elf64_Word n_namesz;
761         Elf64_Word n_descsz;
762         Elf64_Word n_type;
763 } Elf64_Nhdr;
764
765 #define ELF_NOTE_GNU_NAMESZ             4
766 #define ELF_NOTE_GNU_NAME               "GNU\0"
767
768 /*
769  * GNU-specific note type: ABI tag
770  * name: GNU\0
771  * namesz: 4
772  * desc:
773  *      word[0]: OS tag
774  *      word[1]: major version
775  *      word[2]: minor version
776  *      word[3]: teeny version
777  * descsz: 16
778  */
779 /* GNU-specific note name and description sizes */
780 #define ELF_NOTE_TYPE_ABI_TAG           1
781 #define ELF_NOTE_ABI_NAME               ELF_NOTE_GNU_NAME
782 #define ELF_NOTE_ABI_NAMESZ             ELF_NOTE_GNU_NAMESZ
783 #define ELF_NOTE_ABI_DESCSZ             16
784 /* GNU-specific OS/version value stuff */
785 #define ELF_NOTE_ABI_OS_LINUX           0
786 #define ELF_NOTE_ABI_OS_HURD            1
787 #define ELF_NOTE_ABI_OS_SOLARIS         2
788 #define ELF_NOTE_ABI_OS_KFREEBSD        3
789 #define ELF_NOTE_ABI_OS_KNETBSD         4
790
791 /*
792  * GNU-specific note type: Hardware capabilities
793  * name: GNU\0
794  * namesz: 4
795  * desc:
796  *      word[0]: Number of entries
797  *      word[1]: Bitmask of enabled entries
798  *      Followed by a byte id, and a NUL terminated string per entry
799  * descsz: variable
800  */
801 #define ELF_NOTE_TYPE_GNU_HWCAP         2
802
803 /*
804  * GNU-specific note type: Build ID generated by ld
805  * name: GNU\0
806  * desc:
807  *      word[0..4] SHA1 [default] 
808  * or
809  *      word[0..3] md5 or uuid
810  * descsz: 16 or 20
811  */
812 #define ELF_NOTE_TYPE_GNU_BUILD_ID      3
813
814 /* SuSE-specific note type: ABI
815  * name: SuSE\0
816  * namesz: 5
817  * desc:
818  *      half[0] = MMmm
819  *
820  *      M = product major version
821  *      m = product minor version
822  * descsz: 2
823  */
824 #define ELF_NOTE_TYPE_SUSE_TAG  1
825 /* SuSE-specific note name and description sizes */
826 #define ELF_NOTE_SUSE_NAMESZ    5
827 #define ELF_NOTE_SUSE_DESCSZ    2
828 /* SuSE-specific note name */
829 #define ELF_NOTE_SUSE_NAME              "SuSE\0"
830
831 /* SuSE-specific note type: version
832  * name: SuSE\0\0\0\0
833  * namesz: 8
834  * desc: 
835  *      word[0] = VVTTMMmm
836  *
837  *      V = version of following data
838  *      T = product type: [box, sles, nld, whatever]
839  *      M = product major version
840  *      m = product minor version
841  * descsz: 8
842  */
843 #define ELF_NOTE_TYPE_SUSE_VERSION_TAG  0x45537553      /* SuSE in LE */
844 /* SuSE-specific note name and description sizes */
845 #define ELF_NOTE_SUSE_VERSION_NAMESZ    8
846 #define ELF_NOTE_SUSE_VERSION_DESCSZ    8
847 /* SuSE-specific note name */
848 #define ELF_NOTE_SUSE_VERSION_NAME              "SuSE\0\0\0\0"
849
850 /* NetBSD-specific note type: Emulation name.
851  * name: NetBSD\0\0
852  * namesz: 8
853  * desc: 
854  *      word[0]: MMmmrrpp00
855  *
856  *      M = major version
857  *      m = minor version
858  *      r = release ["",A-Z,Z[A-Z] but numeric]
859  *      p = patchlevel
860  * descsz: 4
861  */
862 #define ELF_NOTE_TYPE_NETBSD_TAG        1
863 /* NetBSD-specific note name and description sizes */
864 #define ELF_NOTE_NETBSD_NAMESZ          7
865 #define ELF_NOTE_NETBSD_DESCSZ          4
866 /* NetBSD-specific note name */
867 #define ELF_NOTE_NETBSD_NAME            "NetBSD\0\0"
868
869 /* NetBSD-specific note type: Checksum. 
870  * There should be 1 NOTE per PT_LOAD section.
871  * name: ???
872  * namesz: ???
873  * desc:
874  *      a tuple of <phnum>(16),<chk-type>(16),<chk-value>.
875  * descsz: ???
876  */
877 #define ELF_NOTE_TYPE_CHECKSUM_TAG      2
878 #define ELF_NOTE_CHECKSUM_CRC32         1
879 #define ELF_NOTE_CHECKSUM_MD5           2
880 #define ELF_NOTE_CHECKSUM_SHA1          3
881 #define ELF_NOTE_CHECKSUM_SHA256        4
882
883 /*
884  * NetBSD-specific note type: PaX.
885  * There should be 1 NOTE per executable.
886  * name: PaX\0
887  * namesz: 4
888  * desc:
889  *      word[0]: capability bitmask
890  * descsz: 4
891  */
892 #define ELF_NOTE_TYPE_PAX_TAG           3
893 #define ELF_NOTE_PAX_MPROTECT           0x01    /* Force enable Mprotect */
894 #define ELF_NOTE_PAX_NOMPROTECT         0x02    /* Force disable Mprotect */
895 #define ELF_NOTE_PAX_GUARD              0x04    /* Force enable Segvguard */
896 #define ELF_NOTE_PAX_NOGUARD            0x08    /* Force disable Servguard */
897 #define ELF_NOTE_PAX_ASLR               0x10    /* Force enable ASLR */
898 #define ELF_NOTE_PAX_NOASLR             0x20    /* Force disable ASLR */
899 #define ELF_NOTE_PAX_NAMESZ             4
900 #define ELF_NOTE_PAX_NAME               "PaX\0"
901 #define ELF_NOTE_PAX_DESCSZ             4
902
903 /*
904  * NetBSD-specific core file information.
905  *
906  * NetBSD ELF core files use notes to provide information about
907  * the process's state.  The note name is "NetBSD-CORE" for
908  * information that is global to the process, and "NetBSD-CORE@nn",
909  * where "nn" is the lwpid of the LWP that the information belongs
910  * to (such as register state).
911  *
912  * We use the following note identifiers:
913  *
914  *      ELF_NOTE_NETBSD_CORE_PROCINFO
915  *              Note is a "netbsd_elfcore_procinfo" structure.
916  *
917  * We also use ptrace(2) request numbers (the ones that exist in
918  * machine-dependent space) to identify register info notes.  The
919  * info in such notes is in the same format that ptrace(2) would
920  * export that information.
921  *
922  * Please try to keep the members of this structure nicely aligned,
923  * and if you add elements, add them to the end and bump the version.
924  */
925
926 #define ELF_NOTE_NETBSD_CORE_NAME       "NetBSD-CORE"
927
928 #define ELF_NOTE_NETBSD_CORE_PROCINFO   1
929
930 #define NETBSD_ELFCORE_PROCINFO_VERSION 1
931
932 struct netbsd_elfcore_procinfo {
933         /* Version 1 fields start here. */
934         uint32_t        cpi_version;            /* our version */
935         uint32_t        cpi_cpisize;            /* sizeof(this struct) */
936         uint32_t        cpi_signo;              /* killing signal */
937         uint32_t        cpi_sigcode;            /* signal code */
938         uint32_t        cpi_sigpend[4];         /* pending signals */
939         uint32_t        cpi_sigmask[4];         /* blocked signals */
940         uint32_t        cpi_sigignore[4];       /* ignored signals */
941         uint32_t        cpi_sigcatch[4];        /* caught signals */
942         int32_t         cpi_pid;                /* process ID */
943         int32_t         cpi_ppid;               /* parent process ID */
944         int32_t         cpi_pgrp;               /* process group ID */
945         int32_t         cpi_sid;                /* session ID */
946         uint32_t        cpi_ruid;               /* real user ID */
947         uint32_t        cpi_euid;               /* effective user ID */
948         uint32_t        cpi_svuid;              /* saved user ID */
949         uint32_t        cpi_rgid;               /* real group ID */
950         uint32_t        cpi_egid;               /* effective group ID */
951         uint32_t        cpi_svgid;              /* saved group ID */
952         uint32_t        cpi_nlwps;              /* number of LWPs */
953         int8_t          cpi_name[32];           /* copy of p->p_comm */
954         /* Add version 2 fields below here. */
955         int32_t         cpi_siglwp;     /* LWP target of killing signal */
956 };
957
958 #if !defined(ELFSIZE) && defined(ARCH_ELFSIZE)
959 #define ELFSIZE ARCH_ELFSIZE
960 #endif
961
962 #if defined(ELFSIZE)
963 #define CONCAT(x,y)     __CONCAT(x,y)
964 #define ELFNAME(x)      CONCAT(elf,CONCAT(ELFSIZE,CONCAT(_,x)))
965 #define ELFNAME2(x,y)   CONCAT(x,CONCAT(_elf,CONCAT(ELFSIZE,CONCAT(_,y))))
966 #define ELFNAMEEND(x)   CONCAT(x,CONCAT(_elf,ELFSIZE))
967 #define ELFDEFNNAME(x)  CONCAT(ELF,CONCAT(ELFSIZE,CONCAT(_,x)))
968 #endif
969
970 #if defined(ELFSIZE) && (ELFSIZE == 32)
971 #define Elf_Ehdr        Elf32_Ehdr
972 #define Elf_Phdr        Elf32_Phdr
973 #define Elf_Shdr        Elf32_Shdr
974 #define Elf_Sym         Elf32_Sym
975 #define Elf_Rel         Elf32_Rel
976 #define Elf_Rela        Elf32_Rela
977 #define Elf_Dyn         Elf32_Dyn
978 #define Elf_Word        Elf32_Word
979 #define Elf_Sword       Elf32_Sword
980 #define Elf_Half        Elf32_Half
981 #define Elf_Addr        Elf32_Addr
982 #define Elf_Off         Elf32_Off
983 #define Elf_SOff        Elf32_SOff
984 #define Elf_Nhdr        Elf32_Nhdr
985 #define Elf_Verdef      Elf32_Verdef
986 #define Elf_Verdaux     Elf32_Verdaux
987 #define Elf_Verneed     Elf32_Verneed
988 #define Elf_Vernaux     Elf32_Vernaux
989 #define Elf_Versym      Elf32_Versym
990
991 #define ELF_R_SYM       ELF32_R_SYM
992 #define ELF_R_TYPE      ELF32_R_TYPE
993 #define ELFCLASS        ELFCLASS32
994
995 #define AuxInfo         Aux32Info
996 #elif defined(ELFSIZE) && (ELFSIZE == 64)
997 #define Elf_Ehdr        Elf64_Ehdr
998 #define Elf_Phdr        Elf64_Phdr
999 #define Elf_Shdr        Elf64_Shdr
1000 #define Elf_Sym         Elf64_Sym
1001 #define Elf_Rel         Elf64_Rel
1002 #define Elf_Rela        Elf64_Rela
1003 #define Elf_Dyn         Elf64_Dyn
1004 #define Elf_Word        Elf64_Word
1005 #define Elf_Sword       Elf64_Sword
1006 #define Elf_Half        Elf64_Half
1007 #define Elf_Addr        Elf64_Addr
1008 #define Elf_Off         Elf64_Off
1009 #define Elf_SOff        Elf64_SOff
1010 #define Elf_Nhdr        Elf64_Nhdr
1011 #define Elf_Verdef      Elf64_Verdef
1012 #define Elf_Verdaux     Elf64_Verdaux
1013 #define Elf_Verneed     Elf64_Verneed
1014 #define Elf_Vernaux     Elf64_Vernaux
1015 #define Elf_Versym      Elf64_Versym
1016
1017 #define ELF_R_SYM       ELF64_R_SYM
1018 #define ELF_R_TYPE      ELF64_R_TYPE
1019 #define ELFCLASS        ELFCLASS64
1020
1021 #define AuxInfo         Aux64Info
1022 #endif
1023
1024 #ifndef Elf_Symindx
1025 #define Elf_Symindx     uint32_t
1026 #endif
1027
1028 #define ELF32_ST_BIND(info)             ELF_ST_BIND(info)
1029 #define ELF32_ST_TYPE(info)             ELF_ST_TYPE(info)
1030 #define ELF32_ST_INFO(bind,type)        ELF_ST_INFO(bind,type)
1031 #define ELF32_ST_VISIBILITY(other)      ELF_ST_VISIBILITY(other)
1032
1033 #define ELF64_ST_BIND(info)             ELF_ST_BIND(info)
1034 #define ELF64_ST_TYPE(info)             ELF_ST_TYPE(info)
1035 #define ELF64_ST_INFO(bind,type)        ELF_ST_INFO(bind,type)
1036 #define ELF64_ST_VISIBILITY(other)      ELF_ST_VISIBILITY(other)
1037
1038 typedef struct {
1039         Elf32_Half      si_boundto;     /* direct bindings - symbol bound to */
1040         Elf32_Half      si_flags;       /* per symbol flags */
1041 } Elf32_Syminfo;
1042
1043 typedef struct {
1044         Elf64_Word      si_boundto;     /* direct bindings - symbol bound to */
1045         Elf64_Word      si_flags;       /* per symbol flags */
1046 } Elf64_Syminfo;
1047
1048 #define SYMINFO_FLG_DIRECT      0x0001  /* symbol ref has direct association
1049                                            to object containing definition */
1050 #define SYMINFO_FLG_PASSTHRU    0x0002  /* ignored - see SYMINFO_FLG_FILTER */
1051 #define SYMINFO_FLG_COPY        0x0004  /* symbol is a copy-reloc */
1052 #define SYMINFO_FLG_LAZYLOAD    0x0008  /* object containing defn should be
1053                                            lazily-loaded */
1054 #define SYMINFO_FLG_DIRECTBIND  0x0010  /* ref should be bound directly to
1055                                            object containing definition */
1056 #define SYMINFO_FLG_NOEXTDIRECT 0x0020  /* don't let an external reference
1057                                            directly bind to this symbol */
1058 #define SYMINFO_FLG_FILTER      0x0002  /* symbol ref is associated to a */
1059 #define SYMINFO_FLG_AUXILIARY   0x0040  /*      standard or auxiliary filter */
1060
1061 #define SYMINFO_BT_SELF         0xffff  /* symbol bound to self */
1062 #define SYMINFO_BT_PARENT       0xfffe  /* symbol bound to parent */
1063 #define SYMINFO_BT_NONE         0xfffd  /* no special symbol binding */
1064 #define SYMINFO_BT_EXTERN       0xfffc  /* symbol defined as external */
1065 #define SYMINFO_BT_LOWRESERVE   0xff00  /* beginning of reserved entries */
1066
1067 #define SYMINFO_NONE            0       /* Syminfo version */
1068 #define SYMINFO_CURRENT         1
1069 #define SYMINFO_NUM             2
1070
1071 /*
1072  * These constants are used for Elf32_Verdef struct's version number.  
1073  */
1074 #define VER_DEF_NONE            0
1075 #define VER_DEF_CURRENT         1
1076
1077 /*
1078  * These constants are used for Elf32_Verdef struct's vd_ndx.
1079  */
1080 #define VER_DEF_IDX(x)          VER_NDX(x)
1081
1082 /*
1083  * These constants are used for Elf32_Verdef struct's vd_flags.  
1084  */
1085 #define VER_FLG_BASE            0x1
1086 #define VER_FLG_WEAK            0x2
1087
1088 /*
1089  * These are used in an Elf32_Versym field.
1090  */
1091 #define VER_NDX_LOCAL           0
1092 #define VER_NDX_GLOBAL          1
1093 #define VER_NDX_GIVEN           2
1094
1095 /*
1096  * These constants are used for Elf32_Verneed struct's version number.  
1097  */
1098 #define VER_NEED_NONE           0
1099 #define VER_NEED_CURRENT        1
1100
1101 /*
1102  * These constants are used for Elf32_Vernaux struct's vna_other.
1103  */
1104 #define VER_NEED_HIDDEN         VER_NDX_HIDDEN
1105 #define VER_NEED_IDX(x)         VER_NDX(x)
1106
1107 /* index */
1108 #define VER_NDX_HIDDEN          0x8000
1109 #define VER_NDX(x)              ((x) & ~VER_NDX_HIDDEN)
1110
1111 /*
1112  * GNU Extension hidding symbol
1113  */
1114 #define VERSYM_HIDDEN           0x8000
1115 #define VERSYM_VERSION          0x7fff
1116
1117 #define ELF_VER_CHR             '@'
1118
1119 /*
1120  * These are current size independent.
1121  */
1122
1123 typedef struct {
1124         Elf32_Half      vd_version;     /* version number of structure */
1125         Elf32_Half      vd_flags;       /* flags (VER_FLG_*) */
1126         Elf32_Half      vd_ndx;         /* version index */
1127         Elf32_Half      vd_cnt;         /* number of verdaux entries */
1128         Elf32_Word      vd_hash;        /* hash of name */
1129         Elf32_Word      vd_aux;         /* offset to verdaux entries */
1130         Elf32_Word      vd_next;        /* offset to next verdef */
1131 } Elf32_Verdef;
1132 typedef Elf32_Verdef    Elf64_Verdef;
1133
1134 typedef struct {
1135         Elf32_Word      vda_name;       /* string table offset of name */
1136         Elf32_Word      vda_next;       /* offset to verdaux */
1137 } Elf32_Verdaux;
1138 typedef Elf32_Verdaux   Elf64_Verdaux;
1139
1140 typedef struct {
1141         Elf32_Half      vn_version;     /* version number of structure */
1142         Elf32_Half      vn_cnt;         /* number of vernaux entries */
1143         Elf32_Word      vn_file;        /* string table offset of library name*/
1144         Elf32_Word      vn_aux;         /* offset to vernaux entries */
1145         Elf32_Word      vn_next;        /* offset to next verneed */
1146 } Elf32_Verneed;
1147 typedef Elf32_Verneed   Elf64_Verneed;
1148
1149 typedef struct {
1150         Elf32_Word      vna_hash;       /* Hash of dependency name */
1151         Elf32_Half      vna_flags;      /* flags (VER_FLG_*) */
1152         Elf32_Half      vna_other;      /* unused */
1153         Elf32_Word      vna_name;       /* string table offset to version name*/
1154         Elf32_Word      vna_next;       /* offset to next vernaux */
1155 } Elf32_Vernaux;
1156 typedef Elf32_Vernaux   Elf64_Vernaux;
1157
1158 typedef struct {
1159         Elf32_Half      vs_vers;
1160 } Elf32_Versym;
1161 typedef Elf32_Versym    Elf64_Versym;
1162
1163 #ifdef _KERNEL
1164
1165 #define ELF_AUX_ENTRIES 15      /* Max size of aux array passed to loader */
1166 #define ELF32_NO_ADDR   (~(Elf32_Addr)0) /* Indicates addr. not yet filled in */
1167 #define ELF32_LINK_ADDR ((Elf32_Addr)-2) /* advises to use link address */
1168 #define ELF64_NO_ADDR   (~(Elf64_Addr)0) /* Indicates addr. not yet filled in */
1169 #define ELF64_LINK_ADDR ((Elf64_Addr)-2) /* advises to use link address */
1170
1171 #if defined(ELFSIZE) && (ELFSIZE == 64)
1172 #define ELF_NO_ADDR     ELF64_NO_ADDR
1173 #define ELF_LINK_ADDR   ELF64_LINK_ADDR
1174 #elif defined(ELFSIZE) && (ELFSIZE == 32)
1175 #define ELF_NO_ADDR     ELF32_NO_ADDR
1176 #define ELF_LINK_ADDR   ELF32_LINK_ADDR
1177 #endif
1178
1179 #ifndef ELF32_EHDR_FLAGS_OK
1180 #define ELF32_EHDR_FLAGS_OK(eh) 1
1181 #endif
1182
1183 #ifndef ELF64_EHDR_FLAGS_OK
1184 #define ELF64_EHDR_FLAGS_OK(eh) 1
1185 #endif
1186
1187 #if defined(ELFSIZE) && (ELFSIZE == 64)
1188 #define ELF_EHDR_FLAGS_OK(eh)   ELF64_EHDR_FLAGS_OK(eh)
1189 #else
1190 #define ELF_EHDR_FLAGS_OK(eh)   ELF32_EHDR_FLAGS_OK(eh)
1191 #endif
1192
1193 #if defined(ELFSIZE)
1194 struct elf_args {
1195         Elf_Addr        arg_entry;      /* program entry point */
1196         Elf_Addr        arg_interp;     /* Interpreter load address */
1197         Elf_Addr        arg_phaddr;     /* program header address */
1198         Elf_Addr        arg_phentsize;  /* Size of program header */
1199         Elf_Addr        arg_phnum;      /* Number of program headers */
1200 };
1201 #endif
1202
1203 #ifdef _KERNEL_OPT
1204 #include "opt_execfmt.h"
1205 #endif
1206
1207 struct ps_strings;
1208
1209 #ifdef EXEC_ELF32
1210 int     exec_elf32_makecmds(struct lwp *, struct exec_package *);
1211 int     elf32_copyargs(struct lwp *, struct exec_package *,
1212     struct ps_strings *, char **, void *);
1213
1214 int     coredump_elf32(struct lwp *, void *);
1215 int     coredump_writenote_elf32(struct proc *, void *, Elf32_Nhdr *,
1216     const char *, void *);
1217
1218 int     elf32_check_header(Elf32_Ehdr *, int);
1219 #endif
1220
1221 #ifdef EXEC_ELF64
1222 int     exec_elf64_makecmds(struct lwp *, struct exec_package *);
1223 int     elf64_copyargs(struct lwp *, struct exec_package *,
1224     struct ps_strings *, char **, void *);
1225
1226 int     coredump_elf64(struct lwp *, void *);
1227 int     coredump_writenote_elf64(struct proc *, void *, Elf64_Nhdr *,
1228     const char *, void *);
1229
1230 int     elf64_check_header(Elf64_Ehdr *, int);
1231 #endif
1232
1233 #endif /* _KERNEL */
1234
1235 #endif /* !_SYS_EXEC_ELF_H_ */