source: rtems/cpukit/include/sys/exec_elf.h @ ad94dc3

Last change on this file since ad94dc3 was ad94dc3, checked in by Ryan Long <ryan.long@…>, on 07/19/22 at 16:26:40

sys/exec_elf.h: Bring in newer file

Updated this file with the newer version in NetBSD.

Updates #4682

  • Property mode set to 100644
File size: 52.7 KB
Line 
1/*      $NetBSD: exec_elf.h,v 1.168 2020/10/19 19:33:02 christos 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#include <stddef.h>
48#endif /* _KERNEL || _STANDALONE */
49
50#if defined(ELFSIZE)
51#define CONCAT(x,y)     __CONCAT(x,y)
52#define ELFNAME(x)      CONCAT(elf,CONCAT(ELFSIZE,CONCAT(_,x)))
53#define ELFNAME2(x,y)   CONCAT(x,CONCAT(_elf,CONCAT(ELFSIZE,CONCAT(_,y))))
54#define ELFNAMEEND(x)   CONCAT(x,CONCAT(_elf,ELFSIZE))
55#define ELFDEFNNAME(x)  CONCAT(ELF,CONCAT(ELFSIZE,CONCAT(_,x)))
56#endif
57
58#if HAVE_NBTOOL_CONFIG_H
59#include <nbinclude/machine/elf_machdep.h>
60#else
61#include <machine/elf_machdep.h>
62#endif
63
64typedef uint8_t         Elf_Byte;
65
66typedef uint32_t        Elf32_Addr;
67#define ELF32_FSZ_ADDR  4
68typedef uint32_t        Elf32_Off;
69typedef int32_t         Elf32_SOff;
70#define ELF32_FSZ_OFF   4
71typedef int32_t         Elf32_Sword;
72#define ELF32_FSZ_SWORD 4
73typedef uint32_t        Elf32_Word;
74#define ELF32_FSZ_WORD  4
75typedef uint16_t        Elf32_Half;
76#define ELF32_FSZ_HALF  2
77typedef uint64_t        Elf32_Lword;
78#define ELF32_FSZ_LWORD 8
79
80typedef uint64_t        Elf64_Addr;
81#define ELF64_FSZ_ADDR  8
82typedef uint64_t        Elf64_Off;
83typedef int64_t         Elf64_SOff;
84#define ELF64_FSZ_OFF   8
85
86typedef int32_t         Elf64_Sword;
87#define ELF64_FSZ_SWORD 4
88typedef uint32_t        Elf64_Word;
89#define ELF64_FSZ_WORD  4
90
91typedef int64_t         Elf64_Sxword;
92#define ELF64_FSZ_SXWORD 8
93typedef uint64_t        Elf64_Xword;
94#define ELF64_FSZ_XWORD 8
95typedef uint64_t        Elf64_Lword;
96#define ELF64_FSZ_LWORD 8
97typedef uint16_t        Elf64_Half;
98#define ELF64_FSZ_HALF 2
99
100/*
101 * ELF Header
102 */
103#define ELF_NIDENT      16
104
105typedef struct {
106        unsigned char   e_ident[ELF_NIDENT];    /* Id bytes */
107        Elf32_Half      e_type;                 /* file type */
108        Elf32_Half      e_machine;              /* machine type */
109        Elf32_Word      e_version;              /* version number */
110        Elf32_Addr      e_entry;                /* entry point */
111        Elf32_Off       e_phoff;                /* Program hdr offset */
112        Elf32_Off       e_shoff;                /* Section hdr offset */
113        Elf32_Word      e_flags;                /* Processor flags */
114        Elf32_Half      e_ehsize;               /* sizeof ehdr */
115        Elf32_Half      e_phentsize;            /* Program header entry size */
116        Elf32_Half      e_phnum;                /* Number of program headers */
117        Elf32_Half      e_shentsize;            /* Section header entry size */
118        Elf32_Half      e_shnum;                /* Number of section headers */
119        Elf32_Half      e_shstrndx;             /* String table index */
120} Elf32_Ehdr;
121
122typedef struct {
123        unsigned char   e_ident[ELF_NIDENT];    /* Id bytes */
124        Elf64_Half      e_type;                 /* file type */
125        Elf64_Half      e_machine;              /* machine type */
126        Elf64_Word      e_version;              /* version number */
127        Elf64_Addr      e_entry;                /* entry point */
128        Elf64_Off       e_phoff;                /* Program hdr offset */
129        Elf64_Off       e_shoff;                /* Section hdr offset */
130        Elf64_Word      e_flags;                /* Processor flags */
131        Elf64_Half      e_ehsize;               /* sizeof ehdr */
132        Elf64_Half      e_phentsize;            /* Program header entry size */
133        Elf64_Half      e_phnum;                /* Number of program headers */
134        Elf64_Half      e_shentsize;            /* Section header entry size */
135        Elf64_Half      e_shnum;                /* Number of section headers */
136        Elf64_Half      e_shstrndx;             /* String table index */
137} Elf64_Ehdr;
138
139/* e_ident offsets */
140#define EI_MAG0         0       /* '\177' */
141#define EI_MAG1         1       /* 'E'    */
142#define EI_MAG2         2       /* 'L'    */
143#define EI_MAG3         3       /* 'F'    */
144#define EI_CLASS        4       /* File class */
145#define EI_DATA         5       /* Data encoding */
146#define EI_VERSION      6       /* File version */
147#define EI_OSABI        7       /* Operating system/ABI identification */
148#define EI_ABIVERSION   8       /* ABI version */
149#define EI_PAD          9       /* Start of padding bytes up to EI_NIDENT*/
150#define EI_NIDENT       16      /* First non-ident header byte */
151
152/* e_ident[EI_MAG0,EI_MAG3] */
153#define ELFMAG0         0x7f
154#define ELFMAG1         'E'
155#define ELFMAG2         'L'
156#define ELFMAG3         'F'
157#define ELFMAG          "\177ELF"
158#define SELFMAG         4
159
160/* e_ident[EI_CLASS] */
161#define ELFCLASSNONE    0       /* Invalid class */
162#define ELFCLASS32      1       /* 32-bit objects */
163#define ELFCLASS64      2       /* 64-bit objects */
164#define ELFCLASSNUM     3
165
166/* e_ident[EI_DATA] */
167#define ELFDATANONE     0       /* Invalid data encoding */
168#define ELFDATA2LSB     1       /* 2's complement values, LSB first */
169#define ELFDATA2MSB     2       /* 2's complement values, MSB first */
170
171/* e_ident[EI_VERSION] */
172#define EV_NONE         0       /* Invalid version */
173#define EV_CURRENT      1       /* Current version */
174#define EV_NUM          2
175
176/* e_ident[EI_OSABI] */
177#define ELFOSABI_SYSV           0       /* UNIX System V ABI */
178#define ELFOSABI_HPUX           1       /* HP-UX operating system */
179#define ELFOSABI_NETBSD         2       /* NetBSD */
180#define ELFOSABI_GNU            3       /* GNU/Linux */
181#define ELFOSABI_HURD           4       /* GNU/Hurd - historical */
182#define ELFOSABI_86OPEN         5       /* 86Open - historical */
183#define ELFOSABI_SOLARIS        6       /* Solaris */
184#define ELFOSABI_AIX            7       /* AIX */
185#define ELFOSABI_IRIX           8       /* IRIX */
186#define ELFOSABI_FREEBSD        9       /* FreeBSD */
187#define ELFOSABI_TRU64          10      /* TRU64 UNIX */
188#define ELFOSABI_MODESTO        11      /* Novell Modesto */
189#define ELFOSABI_OPENBSD        12      /* OpenBSD */
190#define ELFOSABI_OPENVMS        13      /* OpenVMS */
191#define ELFOSABI_NSK            14      /* HP Non-Stop Kernel */
192#define ELFOSABI_AROS           15      /* Amiga Research OS */
193#define ELFOSABI_FENIXOS        16      /* The FenixOS highly scalable multi-core OS */
194#define ELFOSABI_CLOUDABI       17      /* Nuxi CloudABI */
195#define ELFOSABI_OPENVOS        18      /* Stratus Technologies OpenVOS */
196/* Unofficial OSABIs follow */
197#define ELFOSABI_ARM            97      /* ARM */
198#define ELFOSABI_STANDALONE     255     /* Standalone (embedded) application */
199
200#define ELFOSABI_NONE           ELFOSABI_SYSV
201
202/* Historical aliases. */
203#define ELFOSABI_LINUX          ELFOSABI_GNU
204#define ELFOSABI_MONTEREY       ELFOSABI_AIX
205
206/* e_type */
207#define ET_NONE         0       /* No file type */
208#define ET_REL          1       /* Relocatable file */
209#define ET_EXEC         2       /* Executable file */
210#define ET_DYN          3       /* Shared object file */
211#define ET_CORE         4       /* Core file */
212#define ET_NUM          5
213
214#define ET_LOOS         0xfe00  /* Operating system specific range */
215#define ET_HIOS         0xfeff
216#define ET_LOPROC       0xff00  /* Processor-specific range */
217#define ET_HIPROC       0xffff
218
219/* e_machine */
220#define EM_NONE         0       /* No machine */
221#define EM_M32          1       /* AT&T WE 32100 */
222#define EM_SPARC        2       /* SPARC */
223#define EM_386          3       /* Intel 80386 */
224#define EM_68K          4       /* Motorola 68000 */
225#define EM_88K          5       /* Motorola 88000 */
226#define EM_486          6       /* Intel 80486 [old] */
227#define EM_IAMCU  6     /* Intel MCU. */
228#define EM_860          7       /* Intel 80860 */
229#define EM_MIPS         8       /* MIPS I Architecture */
230#define EM_S370         9       /* Amdahl UTS on System/370 */
231#define EM_MIPS_RS3_LE  10      /* MIPS RS3000 Little-endian */
232                        /* 11-14 - Reserved */
233#define EM_RS6000       11      /* IBM RS/6000 XXX reserved */
234#define EM_PARISC       15      /* Hewlett-Packard PA-RISC */
235#define EM_NCUBE        16      /* NCube XXX reserved */
236#define EM_VPP500       17      /* Fujitsu VPP500 */
237#define EM_SPARC32PLUS  18      /* Enhanced instruction set SPARC */
238#define EM_960          19      /* Intel 80960 */
239#define EM_PPC          20      /* PowerPC */
240#define EM_PPC64        21      /* 64-bit PowerPC */
241#define EM_S390         22      /* IBM System/390 Processor */
242#define EM_SPU          23      /* IBM SPU/SPC */
243                        /* 24-35 - Reserved */
244#define EM_V800         36      /* NEC V800 */
245#define EM_FR20         37      /* Fujitsu FR20 */
246#define EM_RH32         38      /* TRW RH-32 */
247#define EM_RCE          39      /* Motorola RCE */
248#define EM_ARM          40      /* Advanced RISC Machines ARM */
249#define EM_OLD_ALPHA    41      /* DIGITAL Alpha (obsolete) */
250#define EM_SH           42      /* Hitachi Super-H */
251#define EM_SPARCV9      43      /* SPARC Version 9 */
252#define EM_TRICORE      44      /* Siemens Tricore */
253#define EM_ARC          45      /* Argonaut RISC Core */
254#define EM_H8_300       46      /* Hitachi H8/300 */
255#define EM_H8_300H      47      /* Hitachi H8/300H */
256#define EM_H8S          48      /* Hitachi H8S */
257#define EM_H8_500       49      /* Hitachi H8/500 */
258#define EM_IA_64        50      /* Intel Merced Processor */
259#define EM_MIPS_X       51      /* Stanford MIPS-X */
260#define EM_COLDFIRE     52      /* Motorola Coldfire */
261#define EM_68HC12       53      /* Motorola MC68HC12 */
262#define EM_MMA          54      /* Fujitsu MMA Multimedia Accelerator */
263#define EM_PCP          55      /* Siemens PCP */
264#define EM_NCPU         56      /* Sony nCPU embedded RISC processor */
265#define EM_NDR1         57      /* Denso NDR1 microprocessor */
266#define EM_STARCORE     58      /* Motorola Star*Core processor */
267#define EM_ME16         59      /* Toyota ME16 processor */
268#define EM_ST100        60      /* STMicroelectronics ST100 processor */
269#define EM_TINYJ        61      /* Advanced Logic Corp. TinyJ embedded family processor */
270#define EM_X86_64       62      /* AMD x86-64 architecture */
271#define EM_PDSP         63      /* Sony DSP Processor */
272#define EM_PDP10        64      /* Digital Equipment Corp. PDP-10 */
273#define EM_PDP11        65      /* Digital Equipment Corp. PDP-11 */
274#define EM_FX66         66      /* Siemens FX66 microcontroller */
275#define EM_ST9PLUS      67      /* STMicroelectronics ST9+ 8/16 bit microcontroller */
276#define EM_ST7          68      /* STMicroelectronics ST7 8-bit microcontroller */
277#define EM_68HC16       69      /* Motorola MC68HC16 Microcontroller */
278#define EM_68HC11       70      /* Motorola MC68HC11 Microcontroller */
279#define EM_68HC08       71      /* Motorola MC68HC08 Microcontroller */
280#define EM_68HC05       72      /* Motorola MC68HC05 Microcontroller */
281#define EM_SVX          73      /* Silicon Graphics SVx */
282#define EM_ST19         74      /* STMicroelectronics ST19 8-bit CPU */
283#define EM_VAX          75      /* Digital VAX */
284#define EM_CRIS         76      /* Axis Communications 32-bit embedded processor */
285#define EM_JAVELIN      77      /* Infineon Technologies 32-bit embedded CPU */
286#define EM_FIREPATH     78      /* Element 14 64-bit DSP processor */
287#define EM_ZSP          79      /* LSI Logic's 16-bit DSP processor */
288#define EM_MMIX         80      /* Donald Knuth's educational 64-bit processor */
289#define EM_HUANY        81      /* Harvard's machine-independent format */
290#define EM_PRISM        82      /* SiTera Prism */
291#define EM_AVR          83      /* Atmel AVR 8-bit microcontroller */
292#define EM_FR30         84      /* Fujitsu FR30 */
293#define EM_D10V         85      /* Mitsubishi D10V */
294#define EM_D30V         86      /* Mitsubishi D30V */
295#define EM_V850         87      /* NEC v850 */
296#define EM_M32R         88      /* Mitsubishi M32R */
297#define EM_MN10300      89      /* Matsushita MN10300 */
298#define EM_MN10200      90      /* Matsushita MN10200 */
299#define EM_PJ           91      /* picoJava */
300#define EM_OR1K         92      /* OpenRISC 32-bit embedded processor */
301#define EM_OPENRISC     EM_OR1K
302#define EM_ARC_A5       93      /* ARC Cores Tangent-A5 */
303#define EM_XTENSA       94      /* Tensilica Xtensa Architecture */
304#define EM_VIDEOCORE    95      /* Alphamosaic VideoCore processor */
305#define EM_TMM_GPP      96      /* Thompson Multimedia General Purpose Processor */
306#define EM_NS32K        97      /* National Semiconductor 32000 series */
307#define EM_TPC          98      /* Tenor Network TPC processor */
308#define EM_SNP1K        99      /* Trebia SNP 1000 processor */
309#define EM_ST200        100     /* STMicroelectronics ST200 microcontroller */
310#define EM_IP2K         101     /* Ubicom IP2xxx microcontroller family */
311#define EM_MAX          102     /* MAX processor */
312#define EM_CR           103     /* National Semiconductor CompactRISC micorprocessor */
313#define EM_F2MC16       104     /* Fujitsu F2MC16 */
314#define EM_MSP430       105     /* Texas Instruments MSP430 */
315#define EM_BLACKFIN     106     /* Analog Devices Blackfin DSP */
316#define EM_SE_C33       107     /* Seiko Epson S1C33 family */
317#define EM_SEP          108     /* Sharp embedded microprocessor */
318#define EM_ARCA         109     /* Arca RISC microprocessor */
319#define EM_UNICORE      110     /* UNICORE from PKU-Unity Ltd. and MPRC Peking University */
320#define EM_EXCESS       111     /* eXcess: 16/32/64-bit configurable embedded CPU */
321#define EM_DXP          112     /* Icera Semiconductor Inc. Deep Execution Processor */
322#define EM_ALTERA_NIOS2 113     /* Altera Nios II soft-core processor */
323#define EM_CRX          114     /* National Semiconductor CompactRISC CRX microprocessor */
324#define EM_XGATE        115     /* Motorola XGATE embedded processor */
325#define EM_C166         116     /* Infineon C16x/XC16x processor */
326#define EM_M16C         117     /* Renesas M16C series microprocessors */
327#define EM_DSPIC30F     118     /* Microchip Technology dsPIC30F Digital Signal Controller */
328#define EM_CE           119     /* Freescale Communication Engine RISC core */
329#define EM_M32C         120     /* Renesas M32C series microprocessors */
330                        /* 121-130 - Reserved */
331#define EM_TSK3000      131     /* Altium TSK3000 core */
332#define EM_RS08         132     /* Freescale RS08 embedded processor */
333#define EM_SHARC        133     /* Analog Devices SHARC family of 32-bit DSP processors */
334#define EM_ECOG2        134     /* Cyan Technology eCOG2 microprocessor */
335#define EM_SCORE7       135     /* Sunplus S+core7 RISC processor */
336#define EM_DSP24        136     /* New Japan Radio (NJR) 24-bit DSP Processor */
337#define EM_VIDEOCORE3   137     /* Broadcom VideoCore III processor */
338#define EM_LATTICEMICO32        138     /* RISC processor for Lattice FPGA architecture */
339#define EM_SE_C17       139     /* Seiko Epson C17 family */
340#define EM_TI_C6000     140     /* The Texas Instruments TMS320C6000 DSP family */
341#define EM_TI_C2000     141     /* The Texas Instruments TMS320C2000 DSP family */
342#define EM_TI_C5500     142     /* The Texas Instruments TMS320C55x DSP family */
343#define EM_TI_ARP32     143     /* Texas Instruments Application Specific RISC Processor, 32bit fetch */
344#define EM_TI_PRU       144     /* Texas Instruments Programmable Realtime Unit */
345                        /* 145-159 - Reserved */
346#define EM_MMDSP_PLUS   160     /* STMicroelectronics 64bit VLIW Data Signal Processor */
347#define EM_CYPRESS_M8C  161     /* Cypress M8C microprocessor */
348#define EM_R32C         162     /* Renesas R32C series microprocessors */
349#define EM_TRIMEDIA     163     /* NXP Semiconductors TriMedia architecture family */
350#define EM_QDSP6        164     /* QUALCOMM DSP6 Processor */
351#define EM_8051         165     /* Intel 8051 and variants */
352#define EM_STXP7X       166     /* STMicroelectronics STxP7x family of configurable and extensible RISC processors */
353#define EM_NDS32        167     /* Andes Technology compact code size embedded RISC processor family */
354#define EM_ECOG1        168     /* Cyan Technology eCOG1X family */
355#define EM_ECOG1X       168     /* Cyan Technology eCOG1X family */
356#define EM_MAXQ30       169     /* Dallas Semiconductor MAXQ30 Core Micro-controllers */
357#define EM_XIMO16       170     /* New Japan Radio (NJR) 16-bit DSP Processor */
358#define EM_MANIK        171     /* M2000 Reconfigurable RISC Microprocessor */
359#define EM_CRAYNV2      172     /* Cray Inc. NV2 vector architecture */
360#define EM_RX           173     /* Renesas RX family */
361#define EM_METAG        174     /* Imagination Technologies META processor architecture */
362#define EM_MCST_ELBRUS  175     /* MCST Elbrus general purpose hardware architecture */
363#define EM_ECOG16       176     /* Cyan Technology eCOG16 family */
364#define EM_CR16         177     /* National Semiconductor CompactRISC CR16 16-bit microprocessor */
365#define EM_ETPU         178     /* Freescale Extended Time Processing Unit */
366#define EM_SLE9X        179     /* Infineon Technologies SLE9X core */
367#define EM_L10M         180     /* Intel L10M */
368#define EM_K10M         181     /* Intel K10M */
369                        /* 182 - Reserved */
370#define EM_AARCH64      183     /* AArch64 64-bit ARM microprocessor */
371                        /* 184 - Reserved */
372//#define EM_AVR32      185     /* Atmel Corporation 32-bit microprocessor family*/
373#define EM_TILE64       187     /* Tilera TILE64 multicore architecture family */
374#define EM_TILEPRO      188     /* Tilera TILEPro multicore architecture family */
375#define EM_MICROBLAZE   189     /* Xilinx MicroBlaze 32-bit RISC soft processor core */
376#define EM_CUDA         190     /* NVIDIA CUDA architecture */
377#define EM_TILEGX       191     /* Tilera TILE-GX multicore architecture family */
378#define EM_CLOUDSHIELD  192     /* CloudShield architecture family */
379#define EM_COREA_1ST    193     /* KIPO-KAIST Core-A 1st generation processor family */
380#define EM_COREA_2ND    194     /* KIPO-KAIST Core-A 2nd generation processor family */
381#define EM_ARC_COMPACT2 195     /* Synopsys ARCompact V2 */
382#define EM_OPEN8        196     /* Open8 8-bit RISC soft processor core */
383#define EM_RL78         197     /* Renesas RL78 family */
384#define EM_VIDEOCORE5   198     /* Broadcom VideoCore V processor */
385#define EM_78KOR        199     /* Renesas 78KOR family */
386#define EM_56800EX      200     /* Freescale 56800EX Digital Signal Controller (DSC) */
387#define EM_BA1          201     /* Beyond BA1 CPU architecture */
388#define EM_BA2          202     /* Beyond BA2 CPU architecture */
389#define EM_XCORE        203     /* XMOS xCORE processor family */
390#define EM_MCHP_PIC     204     /* Microchip 8-bit PIC(r) family */
391#define EM_INTEL205     205     /* Reserved by Intel */
392#define EM_INTEL206     206     /* Reserved by Intel */
393#define EM_INTEL207     207     /* Reserved by Intel */
394#define EM_INTEL208     208     /* Reserved by Intel */
395#define EM_INTEL209     209     /* Reserved by Intel */
396#define EM_KM32         210     /* KM211 KM32 32-bit processor */
397#define EM_KMX32        211     /* KM211 KMX32 32-bit processor */
398#define EM_KMX16        212     /* KM211 KMX16 16-bit processor */
399#define EM_KMX8         213     /* KM211 KMX8 8-bit processor */
400#define EM_KVARC        214     /* KM211 KVARC processor */
401#define EM_CDP          215     /* Paneve CDP architecture family */
402#define EM_COGE         216     /* Cognitive Smart Memory Processor */
403#define EM_COOL         217     /* Bluechip Systems CoolEngine */
404#define EM_NORC         218     /* Nanoradio Optimized RISC */
405#define EM_CSR_KALIMBA  219     /* CSR Kalimba architecture family */
406#define EM_Z80          220     /* Zilog Z80 */
407#define EM_VISIUM       221     /* Controls and Data Services VISIUMcore processor */
408#define EM_FT32         222     /* FTDI Chip FT32 high performance 32-bit RISC architecture */
409#define EM_MOXIE        223     /* Moxie processor family */
410#define EM_AMDGPU       224     /* AMD GPU architecture */
411                        /* 225-242 - Reserved */
412#define EM_RISCV        243     /* RISC-V */
413
414/* Unofficial machine types follow */
415#define EM_AVR32        6317    /* used by NetBSD/avr32 */
416#define EM_ALPHA_EXP    36902   /* used by NetBSD/alpha; obsolete */
417#define EM_NUM          36903
418
419/*
420 * Program Header
421 */
422typedef struct {
423        Elf32_Word      p_type;         /* entry type */
424        Elf32_Off       p_offset;       /* offset */
425        Elf32_Addr      p_vaddr;        /* virtual address */
426        Elf32_Addr      p_paddr;        /* physical address */
427        Elf32_Word      p_filesz;       /* file size */
428        Elf32_Word      p_memsz;        /* memory size */
429        Elf32_Word      p_flags;        /* flags */
430        Elf32_Word      p_align;        /* memory & file alignment */
431} Elf32_Phdr;
432
433typedef struct {
434        Elf64_Word      p_type;         /* entry type */
435        Elf64_Word      p_flags;        /* flags */
436        Elf64_Off       p_offset;       /* offset */
437        Elf64_Addr      p_vaddr;        /* virtual address */
438        Elf64_Addr      p_paddr;        /* physical address */
439        Elf64_Xword     p_filesz;       /* file size */
440        Elf64_Xword     p_memsz;        /* memory size */
441        Elf64_Xword     p_align;        /* memory & file alignment */
442} Elf64_Phdr;
443
444/* p_type */
445#define PT_NULL         0               /* Program header table entry unused */
446#define PT_LOAD         1               /* Loadable program segment */
447#define PT_DYNAMIC      2               /* Dynamic linking information */
448#define PT_INTERP       3               /* Program interpreter */
449#define PT_NOTE         4               /* Auxiliary information */
450#define PT_SHLIB        5               /* Reserved, unspecified semantics */
451#define PT_PHDR         6               /* Entry for header table itself */
452#define PT_TLS          7               /* TLS initialisation image */
453#define PT_NUM          8
454
455#define PT_LOOS         0x60000000      /* OS-specific range */
456
457/* GNU-specific */
458#define PT_GNU_EH_FRAME 0x6474e550      /* EH frame segment */
459#define PT_GNU_STACK    0x6474e551      /* Indicate executable stack */
460#define PT_GNU_RELRO    0x6474e552      /* Make read-only after relocation */
461
462#define PT_HIOS         0x6fffffff
463#define PT_LOPROC       0x70000000      /* Processor-specific range */
464#define PT_HIPROC       0x7fffffff
465
466#define PT_MIPS_REGINFO 0x70000000
467#define PT_MIPS_ABIFLAGS 0x70000003
468
469/* p_flags */
470#define PF_R            0x4     /* Segment is readable */
471#define PF_W            0x2     /* Segment is writable */
472#define PF_X            0x1     /* Segment is executable */
473
474#define PF_MASKOS       0x0ff00000      /* Operating system specific values */
475#define PF_MASKPROC     0xf0000000      /* Processor-specific values */
476
477/* Extended program header index. */
478#define PN_XNUM         0xffff
479
480/*
481 * Section Headers
482 */
483typedef struct {
484        Elf32_Word      sh_name;        /* section name (.shstrtab index) */
485        Elf32_Word      sh_type;        /* section type */
486        Elf32_Word      sh_flags;       /* section flags */
487        Elf32_Addr      sh_addr;        /* virtual address */
488        Elf32_Off       sh_offset;      /* file offset */
489        Elf32_Word      sh_size;        /* section size */
490        Elf32_Word      sh_link;        /* link to another */
491        Elf32_Word      sh_info;        /* misc info */
492        Elf32_Word      sh_addralign;   /* memory alignment */
493        Elf32_Word      sh_entsize;     /* table entry size */
494} Elf32_Shdr;
495
496typedef struct {
497        Elf64_Word      sh_name;        /* section name (.shstrtab index) */
498        Elf64_Word      sh_type;        /* section type */
499        Elf64_Xword     sh_flags;       /* section flags */
500        Elf64_Addr      sh_addr;        /* virtual address */
501        Elf64_Off       sh_offset;      /* file offset */
502        Elf64_Xword     sh_size;        /* section size */
503        Elf64_Word      sh_link;        /* link to another */
504        Elf64_Word      sh_info;        /* misc info */
505        Elf64_Xword     sh_addralign;   /* memory alignment */
506        Elf64_Xword     sh_entsize;     /* table entry size */
507} Elf64_Shdr;
508
509/* sh_type */
510#define SHT_NULL              0         /* Section header table entry unused */
511#define SHT_PROGBITS          1         /* Program information */
512#define SHT_SYMTAB            2         /* Symbol table */
513#define SHT_STRTAB            3         /* String table */
514#define SHT_RELA              4         /* Relocation information w/ addend */
515#define SHT_HASH              5         /* Symbol hash table */
516#define SHT_DYNAMIC           6         /* Dynamic linking information */
517#define SHT_NOTE              7         /* Auxiliary information */
518#define SHT_NOBITS            8         /* No space allocated in file image */
519#define SHT_REL               9         /* Relocation information w/o addend */
520#define SHT_SHLIB            10         /* Reserved, unspecified semantics */
521#define SHT_DYNSYM           11         /* Symbol table for dynamic linker */
522#define SHT_INIT_ARRAY       14         /* Initialization function pointers */
523#define SHT_FINI_ARRAY       15         /* Termination function pointers */
524#define SHT_PREINIT_ARRAY    16         /* Pre-initialization function ptrs */
525#define SHT_GROUP            17         /* Section group */
526#define SHT_SYMTAB_SHNDX     18         /* Section indexes (see SHN_XINDEX) */
527#define SHT_NUM              19
528
529#define SHT_LOOS             0x60000000 /* Operating system specific range */
530#define SHT_GNU_INCREMENTAL_INPUTS 0x6fff4700   /* GNU incremental build data */
531#define SHT_LOSUNW           0x6ffffff4
532#define SHT_SUNW_dof         0x6ffffff4
533#define SHT_GNU_ATTRIBUTES   0x6ffffff5 /* GNU object attributes */
534#define SHT_SUNW_cap         0x6ffffff5
535#define SHT_SUNW_SIGNATURE   0x6ffffff6
536#define SHT_GNU_HASH         0x6ffffff6 /* GNU style symbol hash table */
537#define SHT_GNU_LIBLIST      0x6ffffff7 /* GNU list of prelink dependencies */
538#define SHT_SUNW_move        0x6ffffffa
539#define SHT_SUNW_COMDAT      0x6ffffffb
540#define SHT_SUNW_syminfo     0x6ffffffc
541#define SHT_SUNW_verdef      0x6ffffffd /* Versions defined by file */
542#define SHT_GNU_verdef       SHT_SUNW_verdef
543#define SHT_SUNW_verneed     0x6ffffffe /* Versions needed by file */
544#define SHT_GNU_verneed      SHT_SUNW_verneed
545#define SHT_SUNW_versym      0x6fffffff /* Symbol versions */
546#define SHT_GNU_versym       SHT_SUNW_versym
547#define SHT_HISUNW           0x6fffffff
548#define SHT_HIOS             0x6fffffff
549#define SHT_LOPROC           0x70000000 /* Processor-specific range */
550#define SHT_AMD64_UNWIND     0x70000001 /* unwind information */
551#define SHT_ARM_EXIDX        0x70000001 /* exception index table */
552#define SHT_ARM_PREEMPTMAP   0x70000002 /* BPABI DLL dynamic linking
553                                         * pre-emption map */
554#define SHT_ARM_ATTRIBUTES   0x70000003 /* Object file compatibility
555                                         * attributes */
556#define SHT_ARM_DEBUGOVERLAY 0x70000004 /* See DBGOVL for details */
557#define SHT_ARM_OVERLAYSECTION 0x70000005
558#define SHT_MIPS_REGINFO     0x70000006
559#define SHT_MIPS_OPTIONS     0x7000000d
560#define SHT_MIPS_DWARF       0x7000001e /* MIPS gcc uses MIPS_DWARF */
561#define SHT_MIPS_XHASH       0x7000002b /* MIPS version of GNU_HASH */
562#define SHT_HIPROC           0x7fffffff
563#define SHT_LOUSER           0x80000000 /* Application-specific range */
564#define SHT_HIUSER           0xffffffff
565
566/* sh_flags */
567#define SHF_WRITE            0x00000001 /* Contains writable data */
568#define SHF_ALLOC            0x00000002 /* Occupies memory */
569#define SHF_EXECINSTR        0x00000004 /* Contains executable insns */
570#define SHF_MERGE            0x00000010 /* Might be merged */
571#define SHF_STRINGS          0x00000020 /* Contains nul terminated strings */
572#define SHF_INFO_LINK        0x00000040 /* "sh_info" contains SHT index */
573#define SHF_LINK_ORDER       0x00000080 /* Preserve order after combining */
574#define SHF_OS_NONCONFORMING 0x00000100 /* OS specific handling required */
575#define SHF_GROUP            0x00000200 /* Is member of a group */
576#define SHF_TLS              0x00000400 /* Holds thread-local data */
577#define SHF_MASKOS           0x0ff00000 /* Operating system specific values */
578#define SHF_MASKPROC         0xf0000000 /* Processor-specific values */
579#define SHF_ORDERED          0x40000000 /* Ordering requirement (Solaris) */
580#define SHF_EXCLUDE          0x80000000 /* Excluded unless unles ref/alloc
581                                           (Solaris).*/
582/*
583 * Symbol Table
584 */
585typedef struct {
586        Elf32_Word      st_name;        /* Symbol name (.strtab index) */
587        Elf32_Word      st_value;       /* value of symbol */
588        Elf32_Word      st_size;        /* size of symbol */
589        Elf_Byte        st_info;        /* type / binding attrs */
590        Elf_Byte        st_other;       /* unused */
591        Elf32_Half      st_shndx;       /* section index of symbol */
592} Elf32_Sym;
593
594typedef struct {
595        Elf64_Word      st_name;        /* Symbol name (.strtab index) */
596        Elf_Byte        st_info;        /* type / binding attrs */
597        Elf_Byte        st_other;       /* unused */
598        Elf64_Half      st_shndx;       /* section index of symbol */
599        Elf64_Addr      st_value;       /* value of symbol */
600        Elf64_Xword     st_size;        /* size of symbol */
601} Elf64_Sym;
602
603/* Symbol Table index of the undefined symbol */
604#define ELF_SYM_UNDEFINED       0
605
606#define STN_UNDEF               0       /* undefined index */
607
608/* st_info: Symbol Bindings */
609#define STB_LOCAL               0       /* local symbol */
610#define STB_GLOBAL              1       /* global symbol */
611#define STB_WEAK                2       /* weakly defined global symbol */
612#define STB_NUM                 3
613
614#define STB_LOOS                10      /* Operating system specific range */
615#define STB_HIOS                12
616#define STB_LOPROC              13      /* Processor-specific range */
617#define STB_HIPROC              15
618
619/* st_info: Symbol Types */
620#define STT_NOTYPE              0       /* Type not specified */
621#define STT_OBJECT              1       /* Associated with a data object */
622#define STT_FUNC                2       /* Associated with a function */
623#define STT_SECTION             3       /* Associated with a section */
624#define STT_FILE                4       /* Associated with a file name */
625#define STT_COMMON              5       /* Uninitialised common block */
626#define STT_TLS                 6       /* Thread local data object */
627#define STT_NUM                 7
628
629#define STT_LOOS                10      /* Operating system specific range */
630#define STT_GNU_IFUNC           10      /* GNU extension: indirect function */
631#define STT_HIOS                12
632#define STT_LOPROC              13      /* Processor-specific range */
633#define STT_HIPROC              15
634
635/* st_other: Visibility Types */
636#define STV_DEFAULT             0       /* use binding type */
637#define STV_INTERNAL            1       /* not referenced from outside */
638#define STV_HIDDEN              2       /* not visible, may be used via ptr */
639#define STV_PROTECTED           3       /* visible, not preemptible */
640#define STV_EXPORTED            4
641#define STV_SINGLETON           5
642#define STV_ELIMINATE           6
643
644/* st_info/st_other utility macros */
645#define ELF_ST_BIND(info)               ((uint32_t)(info) >> 4)
646#define ELF_ST_TYPE(info)               ((uint32_t)(info) & 0xf)
647#define ELF_ST_INFO(bind,type)          ((Elf_Byte)(((bind) << 4) | \
648                                         ((type) & 0xf)))
649#define ELF_ST_VISIBILITY(other)        ((uint32_t)(other) & 3)
650
651/*
652 * Special section indexes
653 */
654#define SHN_UNDEF       0               /* Undefined section */
655
656#define SHN_LORESERVE   0xff00          /* Reserved range */
657#define SHN_ABS         0xfff1          /*  Absolute symbols */
658#define SHN_COMMON      0xfff2          /*  Common symbols */
659#define SHN_XINDEX      0xffff          /* Escape -- index stored elsewhere */
660#define SHN_HIRESERVE   0xffff
661
662#define SHN_LOPROC      0xff00          /* Processor-specific range */
663#define SHN_HIPROC      0xff1f
664#define SHN_LOOS        0xff20          /* Operating system specific range */
665#define SHN_HIOS        0xff3f
666
667#define SHN_MIPS_ACOMMON 0xff00
668#define SHN_MIPS_TEXT   0xff01
669#define SHN_MIPS_DATA   0xff02
670#define SHN_MIPS_SCOMMON 0xff03
671
672/*
673 * Relocation Entries
674 */
675typedef struct {
676        Elf32_Word      r_offset;       /* where to do it */
677        Elf32_Word      r_info;         /* index & type of relocation */
678} Elf32_Rel;
679
680typedef struct {
681        Elf32_Word      r_offset;       /* where to do it */
682        Elf32_Word      r_info;         /* index & type of relocation */
683        Elf32_Sword     r_addend;       /* adjustment value */
684} Elf32_Rela;
685
686/* r_info utility macros */
687#define ELF32_R_SYM(info)       ((info) >> 8)
688#define ELF32_R_TYPE(info)      ((info) & 0xff)
689#define ELF32_R_INFO(sym, type) (((sym) << 8) + (unsigned char)(type))
690
691typedef struct {
692        Elf64_Addr      r_offset;       /* where to do it */
693        Elf64_Xword     r_info;         /* index & type of relocation */
694} Elf64_Rel;
695
696typedef struct {
697        Elf64_Addr      r_offset;       /* where to do it */
698        Elf64_Xword     r_info;         /* index & type of relocation */
699        Elf64_Sxword    r_addend;       /* adjustment value */
700} Elf64_Rela;
701
702/* r_info utility macros */
703#define ELF64_R_SYM(info)       ((info) >> 32)
704#define ELF64_R_TYPE(info)      ((info) & 0xffffffff)
705#define ELF64_R_INFO(sym,type)  (((sym) << 32) + (type))
706
707/*
708 * Move entries
709 */
710typedef struct {
711        Elf32_Lword     m_value;        /* symbol value */
712        Elf32_Word      m_info;         /* size + index */
713        Elf32_Word      m_poffset;      /* symbol offset */
714        Elf32_Half      m_repeat;       /* repeat count */
715        Elf32_Half      m_stride;       /* stride info */
716} Elf32_Move;
717
718#define ELF32_M_SYM(info)       ((info) >> 8)
719#define ELF32_M_SIZE(info)      (info) & 0xff)
720#define ELF32_M_INFO(sym, size) (((sym) << 8) + (unsigned char)(size))
721
722typedef struct {
723        Elf64_Lword     m_value;        /* symbol value */
724        Elf64_Xword     m_info;         /* size + index */
725        Elf64_Xword     m_poffset;      /* symbol offset */
726        Elf64_Word      m_repeat;       /* repeat count */
727        Elf64_Word      m_stride;       /* stride info */
728} Elf64_Move;
729
730#define ELF64_M_SYM(info)       ((info) >> 8)
731#define ELF64_M_SIZE(info)      (info) & 0xff)
732#define ELF64_M_INFO(sym, size) (((sym) << 8) + (unsigned char)(size))
733
734/*
735 * Hardware/software capabilities entry
736 */
737typedef struct {
738        Elf32_Word      c_tag;          /* entry tag value */
739        union {
740            Elf32_Addr  c_ptr;
741            Elf32_Word  c_val;
742        } c_un;
743} Elf32_Cap;
744
745typedef struct {
746        Elf64_Xword     c_tag;          /* entry tag value */
747        union {
748            Elf64_Addr  c_ptr;
749            Elf64_Xword c_val;
750        } c_un;
751} Elf64_Cap;
752
753/*
754 * Dynamic Section structure array
755 */
756typedef struct {
757        Elf32_Word      d_tag;          /* entry tag value */
758        union {
759            Elf32_Addr  d_ptr;
760            Elf32_Word  d_val;
761        } d_un;
762} Elf32_Dyn;
763
764typedef struct {
765        Elf64_Xword     d_tag;          /* entry tag value */
766        union {
767            Elf64_Addr  d_ptr;
768            Elf64_Xword d_val;
769        } d_un;
770} Elf64_Dyn;
771
772/* d_tag */
773#define DT_NULL         0       /* Marks end of dynamic array */
774#define DT_NEEDED       1       /* Name of needed library (DT_STRTAB offset) */
775#define DT_PLTRELSZ     2       /* Size, in bytes, of relocations in PLT */
776#define DT_PLTGOT       3       /* Address of PLT and/or GOT */
777#define DT_HASH         4       /* Address of symbol hash table */
778#define DT_STRTAB       5       /* Address of string table */
779#define DT_SYMTAB       6       /* Address of symbol table */
780#define DT_RELA         7       /* Address of Rela relocation table */
781#define DT_RELASZ       8       /* Size, in bytes, of DT_RELA table */
782#define DT_RELAENT      9       /* Size, in bytes, of one DT_RELA entry */
783#define DT_STRSZ        10      /* Size, in bytes, of DT_STRTAB table */
784#define DT_SYMENT       11      /* Size, in bytes, of one DT_SYMTAB entry */
785#define DT_INIT         12      /* Address of initialization function */
786#define DT_FINI         13      /* Address of termination function */
787#define DT_SONAME       14      /* Shared object name (DT_STRTAB offset) */
788#define DT_RPATH        15      /* Library search path (DT_STRTAB offset) */
789#define DT_SYMBOLIC     16      /* Start symbol search within local object */
790#define DT_REL          17      /* Address of Rel relocation table */
791#define DT_RELSZ        18      /* Size, in bytes, of DT_REL table */
792#define DT_RELENT       19      /* Size, in bytes, of one DT_REL entry */
793#define DT_PLTREL       20      /* Type of PLT relocation entries */
794#define DT_DEBUG        21      /* Used for debugging; unspecified */
795#define DT_TEXTREL      22      /* Relocations might modify non-writable seg */
796#define DT_JMPREL       23      /* Address of relocations associated with PLT */
797#define DT_BIND_NOW     24      /* Process all relocations at load-time */
798#define DT_INIT_ARRAY   25      /* Address of initialization function array */
799#define DT_FINI_ARRAY   26      /* Size, in bytes, of DT_INIT_ARRAY array */
800#define DT_INIT_ARRAYSZ 27      /* Address of termination function array */
801#define DT_FINI_ARRAYSZ 28      /* Size, in bytes, of DT_FINI_ARRAY array*/
802#define DT_RUNPATH      29      /* overrides DT_RPATH */
803#define DT_FLAGS        30      /* Encodes ORIGIN, SYMBOLIC, TEXTREL, BIND_NOW, STATIC_TLS */
804#define DT_ENCODING     31      /* ??? */
805#define DT_PREINIT_ARRAY 32     /* Address of pre-init function array */
806#define DT_PREINIT_ARRAYSZ 33   /* Size, in bytes, of DT_PREINIT_ARRAY array */
807#define DT_NUM          34
808
809#define DT_LOOS         0x60000000      /* Operating system specific range */
810#define DT_GNU_HASH     0x6ffffef5      /* GNU-style hash table */
811#define DT_VERSYM       0x6ffffff0      /* Symbol versions */
812#define DT_FLAGS_1      0x6ffffffb      /* ELF dynamic flags */
813#define DT_VERDEF       0x6ffffffc      /* Versions defined by file */
814#define DT_VERDEFNUM    0x6ffffffd      /* Number of versions defined by file */
815#define DT_VERNEED      0x6ffffffe      /* Versions needed by file */
816#define DT_VERNEEDNUM   0x6fffffff      /* Number of versions needed by file */
817#define DT_HIOS         0x6fffffff
818#define DT_LOPROC       0x70000000      /* Processor-specific range */
819#define DT_MIPS_XHASH   0x70000036      /* MIPS version of GNU_HASH */
820#define DT_HIPROC       0x7fffffff
821
822/* Flag values for DT_FLAGS */
823#define DF_ORIGIN       0x00000001      /* uses $ORIGIN */
824#define DF_SYMBOLIC     0x00000002      /* */
825#define DF_TEXTREL      0x00000004      /* */
826#define DF_BIND_NOW     0x00000008      /* */
827#define DF_STATIC_TLS   0x00000010      /* */
828
829/* Flag values for DT_FLAGS_1 */
830#define DF_1_NOW        0x00000001      /* Same as DF_BIND_NOW */
831#define DF_1_GLOBAL     0x00000002      /* Unused */
832#define DF_1_GROUP      0x00000004      /* Is member of group */
833#define DF_1_NODELETE   0x00000008      /* Cannot be deleted from process */
834#define DF_1_LOADFLTR   0x00000010      /* Immediate loading of filters */
835#define DF_1_INITFIRST  0x00000020      /* init/fini takes priority */
836#define DF_1_NOOPEN     0x00000040      /* Do not allow loading on dlopen() */
837#define DF_1_ORIGIN     0x00000080      /* Require $ORIGIN processing */
838#define DF_1_DIRECT     0x00000100      /* Enable direct bindings */
839#define DF_1_INTERPOSE  0x00000400      /* Is an interposer */
840#define DF_1_NODEFLIB   0x00000800      /* Ignore default library search path */
841#define DF_1_NODUMP     0x00001000      /* Cannot be dumped with dldump(3C) */
842#define DF_1_CONFALT    0x00002000      /* Configuration alternative */
843#define DF_1_ENDFILTEE  0x00004000      /* Filtee ends filter's search */
844#define DF_1_DISPRELDNE 0x00008000      /* Did displacement relocation */
845#define DF_1_DISPRELPND 0x00010000      /* Pending displacement relocation */
846#define DF_1_NODIRECT   0x00020000      /* Has non-direct bindings */
847#define DF_1_IGNMULDEF  0x00040000      /* Used internally */
848#define DF_1_NOKSYMS    0x00080000      /* Used internally */
849#define DF_1_NOHDR      0x00100000      /* Used internally */
850#define DF_1_EDITED     0x00200000      /* Has been modified since build */
851#define DF_1_NORELOC    0x00400000      /* Used internally */
852#define DF_1_SYMINTPOSE 0x00800000      /* Has individual symbol interposers */
853#define DF_1_GLOBAUDIT  0x01000000      /* Require global auditing */
854#define DF_1_SINGLETON  0x02000000      /* Has singleton symbols */
855#define DF_1_STUB       0x04000000      /* Stub */
856#define DF_1_PIE        0x08000000      /* Position Independent Executable */
857
858/*
859 * Auxiliary Vectors
860 */
861typedef struct {
862        Elf32_Word      a_type;                         /* 32-bit id */
863        Elf32_Word      a_v;                            /* 32-bit id */
864} Aux32Info;
865
866typedef struct {
867        Elf64_Word      a_type;         /* 32-bit id */
868        Elf64_Xword     a_v;            /* 64-bit id */
869} Aux64Info;
870
871/* a_type */
872#define AT_NULL         0       /* Marks end of array */
873#define AT_IGNORE       1       /* No meaning, a_un is undefined */
874#define AT_EXECFD       2       /* Open file descriptor of object file */
875#define AT_PHDR         3       /* &phdr[0] */
876#define AT_PHENT        4       /* sizeof(phdr[0]) */
877#define AT_PHNUM        5       /* # phdr entries */
878#define AT_PAGESZ       6       /* PAGESIZE */
879#define AT_BASE         7       /* Interpreter base addr */
880#define AT_FLAGS        8       /* Processor flags */
881#define AT_ENTRY        9       /* Entry address of executable */
882#define AT_DCACHEBSIZE  10      /* Data cache block size */
883#define AT_ICACHEBSIZE  11      /* Instruction cache block size */
884#define AT_UCACHEBSIZE  12      /* Unified cache block size */
885#define AT_STACKBASE    13      /* Base address of the main thread */
886
887        /* Vendor specific */
888#define AT_MIPS_NOTELF  10      /* XXX a_val != 0 -> MIPS XCOFF executable */
889
890#define AT_EUID         2000    /* euid (solaris compatible numbers) */
891#define AT_RUID         2001    /* ruid (solaris compatible numbers) */
892#define AT_EGID         2002    /* egid (solaris compatible numbers) */
893#define AT_RGID         2003    /* rgid (solaris compatible numbers) */
894
895        /* Solaris kernel specific */
896#define AT_SUN_LDELF    2004    /* dynamic linker's ELF header */
897#define AT_SUN_LDSHDR   2005    /* dynamic linker's section header */
898#define AT_SUN_LDNAME   2006    /* dynamic linker's name */
899#define AT_SUN_LPGSIZE  2007    /* large pagesize */
900
901        /* Other information */
902#define AT_SUN_PLATFORM 2008    /* sysinfo(SI_PLATFORM) */
903#define AT_SUN_HWCAP    2009    /* process hardware capabilities */
904#define AT_SUN_IFLUSH   2010    /* do we need to flush the instruction cache? */
905#define AT_SUN_CPU      2011    /* CPU name */
906        /* ibcs2 emulation band aid */
907#define AT_SUN_EMUL_ENTRY 2012  /* coff entry point */
908#define AT_SUN_EMUL_EXECFD 2013 /* coff file descriptor */
909        /* Executable's fully resolved name */
910#define AT_SUN_EXECNAME 2014
911
912/*
913 * The header for GNU-style hash sections.
914 */
915typedef struct {
916        uint32_t        gh_nbuckets;    /* Number of hash buckets. */
917        uint32_t        gh_symndx;      /* First visible symbol in .dynsym. */
918        uint32_t        gh_maskwords;   /* #maskwords used in bloom filter. */
919        uint32_t        gh_shift2;      /* Bloom filter shift count. */
920} Elf_GNU_Hash_Header;
921
922/*
923 * Note Headers
924 */
925typedef struct {
926        Elf32_Word n_namesz;
927        Elf32_Word n_descsz;
928        Elf32_Word n_type;
929} Elf32_Nhdr;
930
931typedef struct {
932        Elf64_Word n_namesz;
933        Elf64_Word n_descsz;
934        Elf64_Word n_type;
935} Elf64_Nhdr;
936
937#define ELF_NOTE_GNU_NAMESZ             4
938#define ELF_NOTE_GNU_NAME               "GNU\0"
939
940/*
941 * GNU-specific note type: ABI tag
942 * name: GNU\0
943 * namesz: 4
944 * desc:
945 *      word[0]: OS tag
946 *      word[1]: major version
947 *      word[2]: minor version
948 *      word[3]: teeny version
949 * descsz: 16
950 */
951/* GNU-specific note name and description sizes */
952#define ELF_NOTE_TYPE_ABI_TAG           1
953#define ELF_NOTE_ABI_NAME               ELF_NOTE_GNU_NAME
954#define ELF_NOTE_ABI_NAMESZ             ELF_NOTE_GNU_NAMESZ
955#define ELF_NOTE_ABI_DESCSZ             16
956/* GNU-specific OS/version value stuff */
957#define ELF_NOTE_ABI_OS_LINUX           0
958#define ELF_NOTE_ABI_OS_HURD            1
959#define ELF_NOTE_ABI_OS_SOLARIS         2
960#define ELF_NOTE_ABI_OS_KFREEBSD        3
961#define ELF_NOTE_ABI_OS_KNETBSD         4
962
963/* Old gcc style, under the ABI tag */
964#define ELF_NOTE_OGCC_NAMESZ            8
965#define ELF_NOTE_OGCC_NAME              "01.01\0\0\0\0"
966#define ELF_NOTE_OGCC_DESCSZ            0
967
968/*
969 * GNU-specific note type: Hardware capabilities
970 * name: GNU\0
971 * namesz: 4
972 * desc:
973 *      word[0]: Number of entries
974 *      word[1]: Bitmask of enabled entries
975 *      Followed by a byte id, and a NUL terminated string per entry
976 * descsz: variable
977 */
978#define ELF_NOTE_TYPE_GNU_HWCAP         2
979
980/*
981 * GNU-specific note type: Build ID generated by ld
982 * name: GNU\0
983 * desc:
984 *      word[0..4] SHA1 [default]
985 * or
986 *      word[0..3] md5 or uuid
987 * descsz: 16 or 20
988 */
989#define ELF_NOTE_TYPE_GNU_BUILD_ID      3
990
991/* SuSE-specific note type: ABI
992 * name: SuSE\0
993 * namesz: 5
994 * desc:
995 *      half[0] = MMmm
996 *
997 *      M = product major version
998 *      m = product minor version
999 * descsz: 2
1000 */
1001#define ELF_NOTE_TYPE_SUSE_TAG  1
1002/* SuSE-specific note name and description sizes */
1003#define ELF_NOTE_SUSE_NAMESZ    5
1004#define ELF_NOTE_SUSE_DESCSZ    2
1005/* SuSE-specific note name */
1006#define ELF_NOTE_SUSE_NAME              "SuSE\0"
1007
1008/* SuSE-specific note type: version
1009 * name: SuSE\0\0\0\0
1010 * namesz: 8
1011 * desc:
1012 *      word[0] = VVTTMMmm
1013 *
1014 *      V = version of following data
1015 *      T = product type: [box, sles, nld, whatever]
1016 *      M = product major version
1017 *      m = product minor version
1018 * descsz: 8
1019 */
1020#define ELF_NOTE_TYPE_SUSE_VERSION_TAG  0x45537553      /* SuSE in LE */
1021/* SuSE-specific note name and description sizes */
1022#define ELF_NOTE_SUSE_VERSION_NAMESZ    8
1023#define ELF_NOTE_SUSE_VERSION_DESCSZ    8
1024/* SuSE-specific note name */
1025#define ELF_NOTE_SUSE_VERSION_NAME              "SuSE\0\0\0\0"
1026
1027/* Go-specific note type: buildid
1028 * name: Go\0\0
1029 * namesz: 4
1030 * desc:
1031 *      words[10]
1032 * descsz: 40
1033 */
1034#define ELF_NOTE_TYPE_GO_BUILDID_TAG    4
1035#define ELF_NOTE_GO_BUILDID_NAMESZ      4
1036#define ELF_NOTE_GO_BUILDID_DESCSZ      40
1037#define ELF_NOTE_GO_BUILDID_NAME        "Go\0\0"
1038
1039/* NetBSD-specific note type: NetBSD ABI version.
1040 * name: NetBSD\0\0
1041 * namesz: 8
1042 * desc:
1043 *      word[0]: MMmmrrpp00
1044 *
1045 *      M = major version
1046 *      m = minor version
1047 *      r = release ["",A-Z,Z[A-Z] but numeric]
1048 *      p = patchlevel
1049 * descsz: 4
1050 */
1051#define ELF_NOTE_TYPE_NETBSD_TAG        1
1052/* NetBSD-specific note name and description sizes */
1053#define ELF_NOTE_NETBSD_NAMESZ          7
1054#define ELF_NOTE_NETBSD_DESCSZ          4
1055/* NetBSD-specific note name */
1056#define ELF_NOTE_NETBSD_NAME            "NetBSD\0\0"
1057
1058/* NetBSD-specific note type: Emulation (obsolete; last used early 2000)
1059 * name: NetBSD\0\0
1060 * namesz: 8
1061 * desc:
1062 *      "netbsd\0"
1063 *
1064 * descsz: 8
1065 */
1066#define ELF_NOTE_TYPE_NETBSD_EMUL_TAG   2
1067#define ELF_NOTE_NETBSD_EMUL_NAMESZ     7
1068#define ELF_NOTE_NETBSD_EMUL_DESCSZ     7
1069/* NetBSD-specific note name */
1070#define ELF_NOTE_NETBSD_EMUL_NAME       "NetBSD\0\0"
1071
1072/*
1073 * NetBSD-specific note type: PaX.
1074 * There should be 1 NOTE per executable.
1075 * name: PaX\0
1076 * namesz: 4
1077 * desc:
1078 *      word[0]: capability bitmask
1079 * descsz: 4
1080 */
1081#define ELF_NOTE_TYPE_PAX_TAG           3
1082#define ELF_NOTE_PAX_MPROTECT           0x01    /* Force enable Mprotect */
1083#define ELF_NOTE_PAX_NOMPROTECT         0x02    /* Force disable Mprotect */
1084#define ELF_NOTE_PAX_GUARD              0x04    /* Force enable Segvguard */
1085#define ELF_NOTE_PAX_NOGUARD            0x08    /* Force disable Servguard */
1086#define ELF_NOTE_PAX_ASLR               0x10    /* Force enable ASLR */
1087#define ELF_NOTE_PAX_NOASLR             0x20    /* Force disable ASLR */
1088#define ELF_NOTE_PAX_NAMESZ             4
1089#define ELF_NOTE_PAX_NAME               "PaX\0"
1090#define ELF_NOTE_PAX_DESCSZ             4
1091
1092/*
1093 * NetBSD-specific core file information.
1094 *
1095 * NetBSD ELF core files use notes to provide information about
1096 * the process's state.  The note name is "NetBSD-CORE" for
1097 * information that is global to the process, and "NetBSD-CORE@nn",
1098 * where "nn" is the lwpid of the LWP that the information belongs
1099 * to (such as register state).
1100 *
1101 * We use the following note identifiers:
1102 *
1103 *      ELF_NOTE_NETBSD_CORE_PROCINFO
1104 *              Note is a "netbsd_elfcore_procinfo" structure.
1105 *      ELF_NOTE_NETBSD_CORE_AUXV
1106 *              Note is an array of AuxInfo structures.
1107 *
1108 * We also use ptrace(2) request numbers (the ones that exist in
1109 * machine-dependent space) to identify register info notes.  The
1110 * info in such notes is in the same format that ptrace(2) would
1111 * export that information.
1112 *
1113 * Please try to keep the members of this structure nicely aligned,
1114 * and if you add elements, add them to the end and bump the version.
1115 */
1116
1117#define ELF_NOTE_NETBSD_CORE_NAME       "NetBSD-CORE"
1118
1119#define ELF_NOTE_NETBSD_CORE_PROCINFO   1
1120#define ELF_NOTE_NETBSD_CORE_AUXV       2
1121
1122#define NETBSD_ELFCORE_PROCINFO_VERSION 1
1123
1124struct netbsd_elfcore_procinfo {
1125        /* Version 1 fields start here. */
1126        uint32_t        cpi_version;    /* netbsd_elfcore_procinfo version */
1127        uint32_t        cpi_cpisize;    /* sizeof(netbsd_elfcore_procinfo) */
1128        uint32_t        cpi_signo;      /* killing signal */
1129        uint32_t        cpi_sigcode;    /* signal code */
1130        uint32_t        cpi_sigpend[4]; /* pending signals */
1131        uint32_t        cpi_sigmask[4]; /* blocked signals */
1132        uint32_t        cpi_sigignore[4];/* ignored signals */
1133        uint32_t        cpi_sigcatch[4];/* caught signals */
1134        int32_t         cpi_pid;        /* process ID */
1135        int32_t         cpi_ppid;       /* parent process ID */
1136        int32_t         cpi_pgrp;       /* process group ID */
1137        int32_t         cpi_sid;        /* session ID */
1138        uint32_t        cpi_ruid;       /* real user ID */
1139        uint32_t        cpi_euid;       /* effective user ID */
1140        uint32_t        cpi_svuid;      /* saved user ID */
1141        uint32_t        cpi_rgid;       /* real group ID */
1142        uint32_t        cpi_egid;       /* effective group ID */
1143        uint32_t        cpi_svgid;      /* saved group ID */
1144        uint32_t        cpi_nlwps;      /* number of LWPs */
1145        int8_t          cpi_name[32];   /* copy of p->p_comm */
1146        /* Add version 2 fields below here. */
1147        int32_t         cpi_siglwp;     /* LWP target of killing signal */
1148};
1149
1150/*
1151 * NetBSD-specific note type: MACHINE_ARCH.
1152 * There should be 1 NOTE per executable.
1153 * name:        NetBSD\0
1154 * namesz:      7
1155 * desc:        string
1156 * descsz:      variable
1157 */
1158#define ELF_NOTE_TYPE_MARCH_TAG         5
1159/* NetBSD-specific note name and description sizes */
1160#define ELF_NOTE_MARCH_NAMESZ           ELF_NOTE_NETBSD_NAMESZ
1161/* NetBSD-specific note name */
1162#define ELF_NOTE_MARCH_NAME             ELF_NOTE_NETBSD_NAME
1163
1164/*
1165 * NetBSD-specific note type: MCMODEL
1166 * There should be 1 NOTE per executable.
1167 * name:        NetBSD\0
1168 * namesz:      7
1169 * code model:  string
1170 */
1171
1172#define ELF_NOTE_TYPE_MCMODEL_TAG       6
1173/* NetBSD-specific note name and description sizes */
1174#define ELF_NOTE_MCMODEL_NAMESZ         ELF_NOTE_NETBSD_NAMESZ
1175/* NetBSD-specific note name */
1176#define ELF_NOTE_MCMODEL_NAME           ELF_NOTE_NETBSD_NAME
1177
1178
1179#if !defined(ELFSIZE)
1180# if defined(_RUMPKERNEL) || !defined(_KERNEL)
1181#  define ELFSIZE ARCH_ELFSIZE
1182# else
1183#  define ELFSIZE KERN_ELFSIZE
1184# endif
1185#endif
1186
1187#if defined(ELFSIZE)
1188#define CONCAT(x,y)     __CONCAT(x,y)
1189#define ELFNAME(x)      CONCAT(elf,CONCAT(ELFSIZE,CONCAT(_,x)))
1190#define ELFNAME2(x,y)   CONCAT(x,CONCAT(_elf,CONCAT(ELFSIZE,CONCAT(_,y))))
1191#define ELFNAMEEND(x)   CONCAT(x,CONCAT(_elf,ELFSIZE))
1192#define ELFDEFNNAME(x)  CONCAT(ELF,CONCAT(ELFSIZE,CONCAT(_,x)))
1193#define ElfW(x)         CONCAT(Elf,CONCAT(ELFSIZE,CONCAT(_,x)))
1194#endif
1195
1196#if defined(ELFSIZE) && (ELFSIZE == 32)
1197#define Elf_Ehdr        Elf32_Ehdr
1198#define Elf_Phdr        Elf32_Phdr
1199#define Elf_Shdr        Elf32_Shdr
1200#define Elf_Sym         Elf32_Sym
1201#define Elf_Rel         Elf32_Rel
1202#define Elf_Rela        Elf32_Rela
1203#define Elf_Dyn         Elf32_Dyn
1204#define Elf_Word        Elf32_Word
1205#define Elf_Sword       Elf32_Sword
1206#define Elf_Half        Elf32_Half
1207#define Elf_Addr        Elf32_Addr
1208#define Elf_Off         Elf32_Off
1209#define Elf_SOff        Elf32_SOff
1210#define Elf_Nhdr        Elf32_Nhdr
1211#define Elf_Verdef      Elf32_Verdef
1212#define Elf_Verdaux     Elf32_Verdaux
1213#define Elf_Verneed     Elf32_Verneed
1214#define Elf_Vernaux     Elf32_Vernaux
1215#define Elf_Versym      Elf32_Versym
1216
1217#define ELF_R_SYM       ELF32_R_SYM
1218#define ELF_R_TYPE      ELF32_R_TYPE
1219#define ELFCLASS        ELFCLASS32
1220
1221#define AuxInfo         Aux32Info
1222#elif defined(ELFSIZE) && (ELFSIZE == 64)
1223#define Elf_Ehdr        Elf64_Ehdr
1224#define Elf_Phdr        Elf64_Phdr
1225#define Elf_Shdr        Elf64_Shdr
1226#define Elf_Sym         Elf64_Sym
1227#define Elf_Rel         Elf64_Rel
1228#define Elf_Rela        Elf64_Rela
1229#define Elf_Dyn         Elf64_Dyn
1230#define Elf_Word        Elf64_Word
1231#define Elf_Sword       Elf64_Sword
1232#define Elf_Half        Elf64_Half
1233#define Elf_Addr        Elf64_Addr
1234#define Elf_Off         Elf64_Off
1235#define Elf_SOff        Elf64_SOff
1236#define Elf_Nhdr        Elf64_Nhdr
1237#define Elf_Verdef      Elf64_Verdef
1238#define Elf_Verdaux     Elf64_Verdaux
1239#define Elf_Verneed     Elf64_Verneed
1240#define Elf_Vernaux     Elf64_Vernaux
1241#define Elf_Versym      Elf64_Versym
1242
1243#define ELF_R_SYM       ELF64_R_SYM
1244#define ELF_R_TYPE      ELF64_R_TYPE
1245#define ELFCLASS        ELFCLASS64
1246
1247#define AuxInfo         Aux64Info
1248#endif
1249
1250#ifndef Elf_Symindx
1251#define Elf_Symindx     uint32_t
1252#endif
1253
1254#define ELF32_ST_BIND(info)             ELF_ST_BIND(info)
1255#define ELF32_ST_TYPE(info)             ELF_ST_TYPE(info)
1256#define ELF32_ST_INFO(bind,type)        ELF_ST_INFO(bind,type)
1257#define ELF32_ST_VISIBILITY(other)      ELF_ST_VISIBILITY(other)
1258
1259#define ELF64_ST_BIND(info)             ELF_ST_BIND(info)
1260#define ELF64_ST_TYPE(info)             ELF_ST_TYPE(info)
1261#define ELF64_ST_INFO(bind,type)        ELF_ST_INFO(bind,type)
1262#define ELF64_ST_VISIBILITY(other)      ELF_ST_VISIBILITY(other)
1263
1264typedef struct {
1265        Elf32_Half      si_boundto;     /* direct bindings - symbol bound to */
1266        Elf32_Half      si_flags;       /* per symbol flags */
1267} Elf32_Syminfo;
1268
1269typedef struct {
1270        Elf64_Word      si_boundto;     /* direct bindings - symbol bound to */
1271        Elf64_Word      si_flags;       /* per symbol flags */
1272} Elf64_Syminfo;
1273
1274#define SYMINFO_FLG_DIRECT      0x0001  /* symbol ref has direct association
1275                                           to object containing definition */
1276#define SYMINFO_FLG_PASSTHRU    0x0002  /* ignored - see SYMINFO_FLG_FILTER */
1277#define SYMINFO_FLG_COPY        0x0004  /* symbol is a copy-reloc */
1278#define SYMINFO_FLG_LAZYLOAD    0x0008  /* object containing defn should be
1279                                           lazily-loaded */
1280#define SYMINFO_FLG_DIRECTBIND  0x0010  /* ref should be bound directly to
1281                                           object containing definition */
1282#define SYMINFO_FLG_NOEXTDIRECT 0x0020  /* don't let an external reference
1283                                           directly bind to this symbol */
1284#define SYMINFO_FLG_FILTER      0x0002  /* symbol ref is associated to a */
1285#define SYMINFO_FLG_AUXILIARY   0x0040  /*      standard or auxiliary filter */
1286
1287#define SYMINFO_BT_SELF         0xffff  /* symbol bound to self */
1288#define SYMINFO_BT_PARENT       0xfffe  /* symbol bound to parent */
1289#define SYMINFO_BT_NONE         0xfffd  /* no special symbol binding */
1290#define SYMINFO_BT_EXTERN       0xfffc  /* symbol defined as external */
1291#define SYMINFO_BT_LOWRESERVE   0xff00  /* beginning of reserved entries */
1292
1293#define SYMINFO_NONE            0       /* Syminfo version */
1294#define SYMINFO_CURRENT         1
1295#define SYMINFO_NUM             2
1296
1297/*
1298 * These constants are used for Elf32_Verdef struct's version number.
1299 */
1300#define VER_DEF_NONE            0
1301#define VER_DEF_CURRENT         1
1302
1303/*
1304 * These constants are used for Elf32_Verdef struct's vd_ndx.
1305 */
1306#define VER_DEF_IDX(x)          VER_NDX(x)
1307
1308/*
1309 * These constants are used for Elf32_Verdef struct's vd_flags.
1310 */
1311#define VER_FLG_BASE            0x1
1312#define VER_FLG_WEAK            0x2
1313
1314/*
1315 * These are used in an Elf32_Versym field.
1316 */
1317#define VER_NDX_LOCAL           0
1318#define VER_NDX_GLOBAL          1
1319#define VER_NDX_GIVEN           2
1320
1321/*
1322 * These constants are used for Elf32_Verneed struct's version number.
1323 */
1324#define VER_NEED_NONE           0
1325#define VER_NEED_CURRENT        1
1326
1327/*
1328 * These constants are used for Elf32_Vernaux struct's vna_other.
1329 */
1330#define VER_NEED_HIDDEN         VER_NDX_HIDDEN
1331#define VER_NEED_IDX(x)         VER_NDX(x)
1332
1333/* index */
1334#define VER_NDX_HIDDEN          0x8000
1335#define VER_NDX(x)              ((x) & ~VER_NDX_HIDDEN)
1336
1337/*
1338 * GNU Extension hidding symbol
1339 */
1340#define VERSYM_HIDDEN           0x8000
1341#define VERSYM_VERSION          0x7fff
1342
1343#define ELF_VER_CHR             '@'
1344
1345/*
1346 * These are current size independent.
1347 */
1348
1349typedef struct {
1350        Elf32_Half      vd_version;     /* version number of structure */
1351        Elf32_Half      vd_flags;       /* flags (VER_FLG_*) */
1352        Elf32_Half      vd_ndx;         /* version index */
1353        Elf32_Half      vd_cnt;         /* number of verdaux entries */
1354        Elf32_Word      vd_hash;        /* hash of name */
1355        Elf32_Word      vd_aux;         /* offset to verdaux entries */
1356        Elf32_Word      vd_next;        /* offset to next verdef */
1357} Elf32_Verdef;
1358typedef Elf32_Verdef    Elf64_Verdef;
1359
1360typedef struct {
1361        Elf32_Word      vda_name;       /* string table offset of name */
1362        Elf32_Word      vda_next;       /* offset to verdaux */
1363} Elf32_Verdaux;
1364typedef Elf32_Verdaux   Elf64_Verdaux;
1365
1366typedef struct {
1367        Elf32_Half      vn_version;     /* version number of structure */
1368        Elf32_Half      vn_cnt;         /* number of vernaux entries */
1369        Elf32_Word      vn_file;        /* string table offset of library name*/
1370        Elf32_Word      vn_aux;         /* offset to vernaux entries */
1371        Elf32_Word      vn_next;        /* offset to next verneed */
1372} Elf32_Verneed;
1373typedef Elf32_Verneed   Elf64_Verneed;
1374
1375typedef struct {
1376        Elf32_Word      vna_hash;       /* Hash of dependency name */
1377        Elf32_Half      vna_flags;      /* flags (VER_FLG_*) */
1378        Elf32_Half      vna_other;      /* unused */
1379        Elf32_Word      vna_name;       /* string table offset to version name*/
1380        Elf32_Word      vna_next;       /* offset to next vernaux */
1381} Elf32_Vernaux;
1382typedef Elf32_Vernaux   Elf64_Vernaux;
1383
1384typedef struct {
1385        Elf32_Half      vs_vers;
1386} Elf32_Versym;
1387typedef Elf32_Versym    Elf64_Versym;
1388
1389#ifdef _KERNEL
1390
1391/*
1392 * Arbitrary limits to avoid DoS for excessive memory allocation.
1393 */
1394#define ELF_MAXPHNUM    128
1395#define ELF_MAXSHNUM    32768
1396#define ELF_MAXNOTESIZE 1024
1397
1398#define ELF_AUX_ENTRIES 15      /* Max size of aux array passed to loader */
1399#define ELF32_NO_ADDR   (~(Elf32_Addr)0) /* Indicates addr. not yet filled in */
1400#define ELF32_LINK_ADDR ((Elf32_Addr)-2) /* advises to use link address */
1401#define ELF64_NO_ADDR   (~(Elf64_Addr)0) /* Indicates addr. not yet filled in */
1402#define ELF64_LINK_ADDR ((Elf64_Addr)-2) /* advises to use link address */
1403
1404#if defined(ELFSIZE) && (ELFSIZE == 64)
1405#define ELF_NO_ADDR     ELF64_NO_ADDR
1406#define ELF_LINK_ADDR   ELF64_LINK_ADDR
1407#elif defined(ELFSIZE) && (ELFSIZE == 32)
1408#define ELF_NO_ADDR     ELF32_NO_ADDR
1409#define ELF_LINK_ADDR   ELF32_LINK_ADDR
1410#endif
1411
1412#ifndef ELF32_EHDR_FLAGS_OK
1413#define ELF32_EHDR_FLAGS_OK(eh) 1
1414#endif
1415
1416#ifndef ELF64_EHDR_FLAGS_OK
1417#define ELF64_EHDR_FLAGS_OK(eh) 1
1418#endif
1419
1420#if defined(ELFSIZE) && (ELFSIZE == 64)
1421#define ELF_EHDR_FLAGS_OK(eh)   ELF64_EHDR_FLAGS_OK(eh)
1422#else
1423#define ELF_EHDR_FLAGS_OK(eh)   ELF32_EHDR_FLAGS_OK(eh)
1424#endif
1425
1426#if defined(ELFSIZE)
1427struct elf_args {
1428        Elf_Addr        arg_entry;      /* program entry point */
1429        Elf_Addr        arg_interp;     /* Interpreter load address */
1430        Elf_Addr        arg_phaddr;     /* program header address */
1431        Elf_Addr        arg_phentsize;  /* Size of program header */
1432        Elf_Addr        arg_phnum;      /* Number of program headers */
1433};
1434#endif
1435
1436#ifdef _KERNEL_OPT
1437#include "opt_execfmt.h"
1438#endif
1439
1440struct ps_strings;
1441struct coredump_iostate;
1442struct note_state;
1443struct exec_package;
1444
1445#ifdef EXEC_ELF32
1446int     exec_elf32_makecmds(struct lwp *, struct exec_package *);
1447int     elf32_populate_auxv(struct lwp *, struct exec_package *, char **);
1448int     elf32_copyargs(struct lwp *, struct exec_package *,
1449            struct ps_strings *, char **, void *);
1450
1451int     elf32_check_header(Elf32_Ehdr *);
1452#endif
1453
1454int     real_coredump_elf32(struct lwp *, struct coredump_iostate *);
1455int     coredump_elf32(struct lwp *, struct coredump_iostate *);
1456void    coredump_savenote_elf32(struct note_state *, unsigned int,
1457            const char *, void *, size_t);
1458
1459
1460#ifdef EXEC_ELF64
1461int     exec_elf64_makecmds(struct lwp *, struct exec_package *);
1462int     elf64_populate_auxv(struct lwp *, struct exec_package *, char **);
1463int     elf64_copyargs(struct lwp *, struct exec_package *,
1464            struct ps_strings *, char **, void *);
1465
1466int     elf64_check_header(Elf64_Ehdr *);
1467#endif
1468
1469int     real_coredump_elf64(struct lwp *, struct coredump_iostate *);
1470int     coredump_elf64(struct lwp *, struct coredump_iostate *);
1471void    coredump_savenote_elf64(struct note_state *, unsigned int,
1472            const char *, void *, size_t);
1473
1474
1475#endif /* _KERNEL */
1476
1477#endif /* !_SYS_EXEC_ELF_H_ */
Note: See TracBrowser for help on using the repository browser.