Project

General

Profile

Statistics
| Revision:

root / lab4 / .minix-src / include / sys / exec_elf.h @ 13

History | View | Annotate | Download (44.6 KB)

1
/*        $NetBSD: exec_elf.h,v 1.149 2015/07/30 15:28:18 maxv 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
#ifdef   _BSD_SIZE_T_
50
typedef  _BSD_SIZE_T_    size_t;
51
#undef   _BSD_SIZE_T_
52
#endif
53

    
54
#if HAVE_NBTOOL_CONFIG_H
55
#include <nbinclude/machine/elf_machdep.h>
56
#else
57
#include <machine/elf_machdep.h>
58
#endif
59

    
60
typedef uint8_t                Elf_Byte;
61

    
62
typedef uint32_t        Elf32_Addr;
63
#define ELF32_FSZ_ADDR        4
64
typedef uint32_t        Elf32_Off;
65
typedef int32_t                Elf32_SOff;
66
#define ELF32_FSZ_OFF        4
67
typedef int32_t                Elf32_Sword;
68
#define ELF32_FSZ_SWORD 4
69
typedef uint32_t        Elf32_Word;
70
#define ELF32_FSZ_WORD        4
71
typedef uint16_t        Elf32_Half;
72
#define ELF32_FSZ_HALF        2
73
typedef uint64_t        Elf32_Lword;
74
#define ELF32_FSZ_LWORD 8
75

    
76
typedef uint64_t        Elf64_Addr;
77
#define ELF64_FSZ_ADDR        8
78
typedef uint64_t        Elf64_Off;
79
typedef int64_t                Elf64_SOff;
80
#define ELF64_FSZ_OFF        8
81

    
82
typedef int32_t                Elf64_Sword;
83
#define ELF64_FSZ_SWORD 4
84
typedef uint32_t        Elf64_Word;
85
#define ELF64_FSZ_WORD        4
86

    
87
typedef int64_t                Elf64_Sxword;
88
#define ELF64_FSZ_SXWORD 8
89
typedef uint64_t        Elf64_Xword;
90
#define ELF64_FSZ_XWORD 8
91
typedef uint64_t        Elf64_Lword;
92
#define ELF64_FSZ_LWORD 8
93
typedef uint16_t        Elf64_Half;
94
#define ELF64_FSZ_HALF 2
95

    
96
/*
97
 * ELF Header
98
 */
99
#define ELF_NIDENT        16
100

    
101
typedef struct {
102
        unsigned char        e_ident[ELF_NIDENT];        /* Id bytes */
103
        Elf32_Half        e_type;                        /* file type */
104
        Elf32_Half        e_machine;                /* machine type */
105
        Elf32_Word        e_version;                /* version number */
106
        Elf32_Addr        e_entry;                /* entry point */
107
        Elf32_Off        e_phoff;                /* Program hdr offset */
108
        Elf32_Off        e_shoff;                /* Section hdr offset */
109
        Elf32_Word        e_flags;                /* Processor flags */
110
        Elf32_Half        e_ehsize;                /* sizeof ehdr */
111
        Elf32_Half        e_phentsize;                /* Program header entry size */
112
        Elf32_Half        e_phnum;                /* Number of program headers */
113
        Elf32_Half        e_shentsize;                /* Section header entry size */
114
        Elf32_Half        e_shnum;                /* Number of section headers */
115
        Elf32_Half        e_shstrndx;                /* String table index */
116
} Elf32_Ehdr;
117

    
118
typedef struct {
119
        unsigned char        e_ident[ELF_NIDENT];        /* Id bytes */
120
        Elf64_Half        e_type;                        /* file type */
121
        Elf64_Half        e_machine;                /* machine type */
122
        Elf64_Word        e_version;                /* version number */
123
        Elf64_Addr        e_entry;                /* entry point */
124
        Elf64_Off        e_phoff;                /* Program hdr offset */
125
        Elf64_Off        e_shoff;                /* Section hdr offset */
126
        Elf64_Word        e_flags;                /* Processor flags */
127
        Elf64_Half        e_ehsize;                /* sizeof ehdr */
128
        Elf64_Half        e_phentsize;                /* Program header entry size */
129
        Elf64_Half        e_phnum;                /* Number of program headers */
130
        Elf64_Half        e_shentsize;                /* Section header entry size */
131
        Elf64_Half        e_shnum;                /* Number of section headers */
132
        Elf64_Half        e_shstrndx;                /* String table index */
133
} Elf64_Ehdr;
134

    
135
/* e_ident offsets */
136
#define EI_MAG0                0        /* '\177' */
137
#define EI_MAG1                1        /* 'E'          */
138
#define EI_MAG2                2        /* 'L'          */
139
#define EI_MAG3                3        /* 'F'          */
140
#define EI_CLASS        4        /* File class */
141
#define EI_DATA                5        /* Data encoding */
142
#define EI_VERSION        6        /* File version */
143
#define EI_OSABI        7        /* Operating system/ABI identification */
144
#define EI_ABIVERSION        8        /* ABI version */
145
#define EI_PAD                9        /* Start of padding bytes up to EI_NIDENT*/
146
#define EI_NIDENT        16        /* First non-ident header byte */
147

    
148
/* e_ident[EI_MAG0,EI_MAG3] */
149
#define ELFMAG0                0x7f
150
#define ELFMAG1                'E'
151
#define ELFMAG2                'L'
152
#define ELFMAG3                'F'
153
#define ELFMAG                "\177ELF"
154
#define SELFMAG                4
155

    
156
/* e_ident[EI_CLASS] */
157
#define ELFCLASSNONE        0        /* Invalid class */
158
#define ELFCLASS32        1        /* 32-bit objects */
159
#define ELFCLASS64        2        /* 64-bit objects */
160
#define ELFCLASSNUM        3
161

    
162
/* e_ident[EI_DATA] */
163
#define ELFDATANONE        0        /* Invalid data encoding */
164
#define ELFDATA2LSB        1        /* 2's complement values, LSB first */
165
#define ELFDATA2MSB        2        /* 2's complement values, MSB first */
166

    
167
/* e_ident[EI_VERSION] */
168
#define EV_NONE                0        /* Invalid version */
169
#define EV_CURRENT        1        /* Current version */
170
#define EV_NUM                2
171

    
172
/* e_ident[EI_OSABI] */
173
#define ELFOSABI_SYSV                0        /* UNIX System V ABI */
174
#define ELFOSABI_HPUX                1        /* HP-UX operating system */
175
#define ELFOSABI_NETBSD                2        /* NetBSD */
176
#define ELFOSABI_LINUX                3        /* GNU/Linux */
177
#define ELFOSABI_HURD                4        /* GNU/Hurd */
178
#define ELFOSABI_86OPEN                5        /* 86Open */
179
#define ELFOSABI_SOLARIS        6        /* Solaris */
180
#define ELFOSABI_MONTEREY        7        /* Monterey */
181
#define ELFOSABI_IRIX                8        /* IRIX */
182
#define ELFOSABI_FREEBSD        9        /* FreeBSD */
183
#define ELFOSABI_TRU64                10        /* TRU64 UNIX */
184
#define ELFOSABI_MODESTO        11        /* Novell Modesto */
185
#define ELFOSABI_OPENBSD        12        /* OpenBSD */
186
#define ELFOSABI_OPENVMS        13        /* OpenVMS */
187
#define ELFOSABI_NSK                14        /* HP Non-Stop Kernel */
188
#define ELFOSABI_AROS                15        /* Amiga Research OS */
189
/* Unofficial OSABIs follow */
190
#define ELFOSABI_ARM                97        /* ARM */
191
#define ELFOSABI_STANDALONE        255        /* Standalone (embedded) application */
192

    
193
#define ELFOSABI_NONE                ELFOSABI_SYSV
194
#define ELFOSABI_AIX                ELFOSABI_MONTEREY
195

    
196
/* e_type */
197
#define ET_NONE                0        /* No file type */
198
#define ET_REL                1        /* Relocatable file */
199
#define ET_EXEC                2        /* Executable file */
200
#define ET_DYN                3        /* Shared object file */
201
#define ET_CORE                4        /* Core file */
202
#define ET_NUM                5
203

    
204
#define ET_LOOS                0xfe00        /* Operating system specific range */
205
#define ET_HIOS                0xfeff
206
#define ET_LOPROC        0xff00        /* Processor-specific range */
207
#define ET_HIPROC        0xffff
208

    
209
/* e_machine */
210
#define EM_NONE                0        /* No machine */
211
#define EM_M32                1        /* AT&T WE 32100 */
212
#define EM_SPARC        2        /* SPARC */
213
#define EM_386                3        /* Intel 80386 */
214
#define EM_68K                4        /* Motorola 68000 */
215
#define EM_88K                5        /* Motorola 88000 */
216
#define EM_486                6        /* Intel 80486 */
217
#define EM_860                7        /* Intel 80860 */
218
#define EM_MIPS                8        /* MIPS I Architecture */
219
#define EM_S370                9        /* Amdahl UTS on System/370 */
220
#define EM_MIPS_RS3_LE        10        /* MIPS RS3000 Little-endian */
221
                        /* 11-14 - Reserved */
222
#define EM_RS6000        11        /* IBM RS/6000 XXX reserved */
223
#define EM_PARISC        15        /* Hewlett-Packard PA-RISC */
224
#define EM_NCUBE        16        /* NCube XXX reserved */
225
#define EM_VPP500        17        /* Fujitsu VPP500 */
226
#define EM_SPARC32PLUS        18        /* Enhanced instruction set SPARC */
227
#define EM_960                19        /* Intel 80960 */
228
#define EM_PPC                20        /* PowerPC */
229
#define EM_PPC64        21        /* 64-bit PowerPC */
230
                        /* 22-35 - Reserved */
231
#define EM_S390                22        /* System/390 XXX reserved */
232
#define EM_V800                36        /* NEC V800 */
233
#define EM_FR20                37        /* Fujitsu FR20 */
234
#define EM_RH32                38        /* TRW RH-32 */
235
#define EM_RCE                39        /* Motorola RCE */
236
#define EM_ARM                40        /* Advanced RISC Machines ARM */
237
#define EM_ALPHA        41        /* DIGITAL Alpha */
238
#define EM_SH                42        /* Hitachi Super-H */
239
#define EM_SPARCV9        43        /* SPARC Version 9 */
240
#define EM_TRICORE        44        /* Siemens Tricore */
241
#define EM_ARC                45        /* Argonaut RISC Core */
242
#define EM_H8_300        46        /* Hitachi H8/300 */
243
#define EM_H8_300H        47        /* Hitachi H8/300H */
244
#define EM_H8S                48        /* Hitachi H8S */
245
#define EM_H8_500        49        /* Hitachi H8/500 */
246
#define EM_IA_64        50        /* Intel Merced Processor */
247
#define EM_MIPS_X        51        /* Stanford MIPS-X */
248
#define EM_COLDFIRE        52        /* Motorola Coldfire */
249
#define EM_68HC12        53        /* Motorola MC68HC12 */
250
#define EM_MMA                54        /* Fujitsu MMA Multimedia Accelerator */
251
#define EM_PCP                55        /* Siemens PCP */
252
#define EM_NCPU                56        /* Sony nCPU embedded RISC processor */
253
#define EM_NDR1                57        /* Denso NDR1 microprocessor */
254
#define EM_STARCORE        58        /* Motorola Star*Core processor */
255
#define EM_ME16                59        /* Toyota ME16 processor */
256
#define EM_ST100        60        /* STMicroelectronics ST100 processor */
257
#define EM_TINYJ        61        /* Advanced Logic Corp. TinyJ embedded family processor */
258
#define EM_X86_64        62        /* AMD x86-64 architecture */
259
#define EM_PDSP                63        /* Sony DSP Processor */
260
#define EM_PDP10        64        /* Digital Equipment Corp. PDP-10 */
261
#define EM_PDP11        65        /* Digital Equipment Corp. PDP-11 */
262
#define EM_FX66                66        /* Siemens FX66 microcontroller */
263
#define EM_ST9PLUS        67        /* STMicroelectronics ST9+ 8/16 bit microcontroller */
264
#define EM_ST7                68        /* STMicroelectronics ST7 8-bit microcontroller */
265
#define EM_68HC16        69        /* Motorola MC68HC16 Microcontroller */
266
#define EM_68HC11        70        /* Motorola MC68HC11 Microcontroller */
267
#define EM_68HC08        71        /* Motorola MC68HC08 Microcontroller */
268
#define EM_68HC05        72        /* Motorola MC68HC05 Microcontroller */
269
#define EM_SVX                73        /* Silicon Graphics SVx */
270
#define EM_ST19                74        /* STMicroelectronics ST19 8-bit CPU */
271
#define EM_VAX                75        /* Digital VAX */
272
#define EM_CRIS                76        /* Axis Communications 32-bit embedded processor */
273
#define EM_JAVELIN        77        /* Infineon Technologies 32-bit embedded CPU */
274
#define EM_FIREPATH        78        /* Element 14 64-bit DSP processor */
275
#define EM_ZSP                79        /* LSI Logic's 16-bit DSP processor */
276
#define EM_MMIX                80        /* Donald Knuth's educational 64-bit processor */
277
#define EM_HUANY        81        /* Harvard's machine-independent format */
278
#define EM_PRISM        82        /* SiTera Prism */
279
#define EM_AVR                83        /* Atmel AVR 8-bit microcontroller */
280
#define EM_FR30                84        /* Fujitsu FR30 */
281
#define EM_D10V                85        /* Mitsubishi D10V */
282
#define EM_D30V                86        /* Mitsubishi D30V */
283
#define EM_V850                87        /* NEC v850 */
284
#define EM_M32R                88        /* Mitsubishi M32R */
285
#define EM_MN10300        89        /* Matsushita MN10300 */
286
#define EM_MN10200        90        /* Matsushita MN10200 */
287
#define EM_PJ                91        /* picoJava */
288
#define EM_OR1K                92        /* OpenRISC 32-bit embedded processor */
289
#define EM_OPENRISC        EM_OR1K
290
#define EM_ARC_A5        93        /* ARC Cores Tangent-A5 */
291
#define EM_XTENSA        94        /* Tensilica Xtensa Architecture */
292
#define EM_VIDEOCORE        95        /* Alphamosaic VideoCore processor */
293
#define EM_TMM_GPP        96        /* Thompson Multimedia General Purpose Processor */
294
#define EM_NS32K        97        /* National Semiconductor 32000 series */
295
#define EM_TPC                98        /* Tenor Network TPC processor */
296
#define EM_SNP1K        99        /* Trebia SNP 1000 processor */
297
#define EM_ST200        100        /* STMicroelectronics ST200 microcontroller */
298
#define EM_IP2K                101        /* Ubicom IP2xxx microcontroller family */
299
#define EM_MAX                102        /* MAX processor */
300
#define EM_CR                103        /* National Semiconductor CompactRISC micorprocessor */
301
#define EM_F2MC16        104        /* Fujitsu F2MC16 */
302
#define EM_MSP430        105        /* Texas Instruments MSP430 */
303
#define EM_BLACKFIN        106        /* Analog Devices Blackfin DSP */
304
#define EM_SE_C33        107        /* Seiko Epson S1C33 family */
305
#define EM_SEP                108        /* Sharp embedded microprocessor */
306
#define EM_ARCA                109        /* Arca RISC microprocessor */
307
#define EM_UNICORE        110        /* UNICORE from PKU-Unity Ltd. and MPRC Peking University */
308
#define EM_ALTERA_NIOS2        113        /* Altera Nios II soft-core processor */
309
#define EM_AARCH64        183        /* AArch64 64-bit ARM microprocessor */
310
#define EM_AVR32        185        /* Atmel Corporation 32-bit microprocessor family*/
311
#define EM_TILE64        187        /* Tilera TILE64 multicore architecture family */
312
#define EM_TILEPRO        188        /* Tilera TILEPro multicore architecture family */
313
#define EM_MICROBLAZE        189        /* Xilinx MicroBlaze 32-bit RISC soft processor core */
314
#define EM_TILEGX        192        /* Tilera TILE-GX multicore architecture family */
315
#define EM_Z80                220        /* Zilog Z80 */
316
#define EM_RISCV        243        /* RISC-V */
317

    
318
/* Unofficial machine types follow */
319
#define EM_ALPHA_EXP        36902        /* used by NetBSD/alpha; obsolete */
320
#define EM_NUM                36903
321

    
322
/*
323
 * Program Header
324
 */
325
typedef struct {
326
        Elf32_Word        p_type;                /* entry type */
327
        Elf32_Off        p_offset;        /* offset */
328
        Elf32_Addr        p_vaddr;        /* virtual address */
329
        Elf32_Addr        p_paddr;        /* physical address */
330
        Elf32_Word        p_filesz;        /* file size */
331
        Elf32_Word        p_memsz;        /* memory size */
332
        Elf32_Word        p_flags;        /* flags */
333
        Elf32_Word        p_align;        /* memory & file alignment */
334
} Elf32_Phdr;
335

    
336
typedef struct {
337
        Elf64_Word        p_type;                /* entry type */
338
        Elf64_Word        p_flags;        /* flags */
339
        Elf64_Off        p_offset;        /* offset */
340
        Elf64_Addr        p_vaddr;        /* virtual address */
341
        Elf64_Addr        p_paddr;        /* physical address */
342
        Elf64_Xword        p_filesz;        /* file size */
343
        Elf64_Xword        p_memsz;        /* memory size */
344
        Elf64_Xword        p_align;        /* memory & file alignment */
345
} Elf64_Phdr;
346

    
347
/* p_type */
348
#define PT_NULL                0                /* Program header table entry unused */
349
#define PT_LOAD                1                /* Loadable program segment */
350
#define PT_DYNAMIC        2                /* Dynamic linking information */
351
#define PT_INTERP        3                /* Program interpreter */
352
#define PT_NOTE                4                /* Auxiliary information */
353
#define PT_SHLIB        5                /* Reserved, unspecified semantics */
354
#define PT_PHDR                6                /* Entry for header table itself */
355
#define PT_TLS                7                /* TLS initialisation image */
356
#define PT_NUM                8
357

    
358
#define PT_LOOS                0x60000000        /* OS-specific range */
359

    
360
/* GNU-specific */
361
#define PT_GNU_EH_FRAME 0x6474e550        /* EH frame segment */
362
#define PT_GNU_STACK        0x6474e551        /* Indicate executable stack */
363
#define PT_GNU_RELRO        0x6474e552        /* Make read-only after relocation */
364

    
365
#define PT_HIOS                0x6fffffff
366
#define PT_LOPROC        0x70000000        /* Processor-specific range */
367
#define PT_HIPROC        0x7fffffff
368

    
369
#define PT_MIPS_REGINFO 0x70000000
370

    
371
/* p_flags */
372
#define PF_R                0x4                /* Segment is readable */
373
#define PF_W                0x2                /* Segment is writable */
374
#define PF_X                0x1                /* Segment is executable */
375

    
376
#define PF_MASKOS        0x0ff00000        /* Operating system specific values */
377
#define PF_MASKPROC        0xf0000000        /* Processor-specific values */
378

    
379
/* Extended program header index. */
380
#define PN_XNUM                0xffff
381

    
382
/*
383
 * Section Headers
384
 */
385
typedef struct {
386
        Elf32_Word        sh_name;        /* section name (.shstrtab index) */
387
        Elf32_Word        sh_type;        /* section type */
388
        Elf32_Word        sh_flags;        /* section flags */
389
        Elf32_Addr        sh_addr;        /* virtual address */
390
        Elf32_Off        sh_offset;        /* file offset */
391
        Elf32_Word        sh_size;        /* section size */
392
        Elf32_Word        sh_link;        /* link to another */
393
        Elf32_Word        sh_info;        /* misc info */
394
        Elf32_Word        sh_addralign;        /* memory alignment */
395
        Elf32_Word        sh_entsize;        /* table entry size */
396
} Elf32_Shdr;
397

    
398
typedef struct {
399
        Elf64_Word        sh_name;        /* section name (.shstrtab index) */
400
        Elf64_Word        sh_type;        /* section type */
401
        Elf64_Xword        sh_flags;        /* section flags */
402
        Elf64_Addr        sh_addr;        /* virtual address */
403
        Elf64_Off        sh_offset;        /* file offset */
404
        Elf64_Xword        sh_size;        /* section size */
405
        Elf64_Word        sh_link;        /* link to another */
406
        Elf64_Word        sh_info;        /* misc info */
407
        Elf64_Xword        sh_addralign;        /* memory alignment */
408
        Elf64_Xword        sh_entsize;        /* table entry size */
409
} Elf64_Shdr;
410

    
411
/* sh_type */
412
#define SHT_NULL              0                /* Section header table entry unused */
413
#define SHT_PROGBITS              1                /* Program information */
414
#define SHT_SYMTAB              2                /* Symbol table */
415
#define SHT_STRTAB              3                /* String table */
416
#define SHT_RELA              4                /* Relocation information w/ addend */
417
#define SHT_HASH              5                /* Symbol hash table */
418
#define SHT_DYNAMIC              6                /* Dynamic linking information */
419
#define SHT_NOTE              7                /* Auxiliary information */
420
#define SHT_NOBITS              8                /* No space allocated in file image */
421
#define SHT_REL                      9                /* Relocation information w/o addend */
422
#define SHT_SHLIB             10                /* Reserved, unspecified semantics */
423
#define SHT_DYNSYM             11                /* Symbol table for dynamic linker */
424
#define SHT_INIT_ARRAY             14                /* Initialization function pointers */
425
#define SHT_FINI_ARRAY             15                /* Termination function pointers */
426
#define SHT_PREINIT_ARRAY    16                /* Pre-initialization function ptrs */
427
#define SHT_GROUP             17                /* Section group */
428
#define SHT_SYMTAB_SHNDX     18                /* Section indexes (see SHN_XINDEX) */
429
#define SHT_NUM                     19
430

    
431
#define SHT_LOOS             0x60000000 /* Operating system specific range */
432
#define SHT_GNU_INCREMENTAL_INPUTS 0x6fff4700   /* GNU incremental build data */
433
#define        SHT_LOSUNW             0x6ffffff4
434
#define        SHT_SUNW_dof             0x6ffffff4
435
#define        SHT_GNU_ATTRIBUTES   0x6ffffff5        /* GNU object attributes */
436
#define        SHT_SUNW_cap             0x6ffffff5
437
#define        SHT_SUNW_SIGNATURE   0x6ffffff6
438
#define SHT_GNU_HASH             0x6ffffff6 /* GNU style symbol hash table */
439
#define SHT_GNU_LIBLIST             0x6ffffff7 /* GNU list of prelink dependencies */
440
#define SHT_SUNW_move             0x6ffffffa
441
#define        SHT_SUNW_COMDAT             0x6ffffffb
442
#define SHT_SUNW_syminfo     0x6ffffffc
443
#define SHT_SUNW_verdef             0x6ffffffd /* Versions defined by file */
444
#define SHT_GNU_verdef             SHT_SUNW_verdef
445
#define SHT_SUNW_verneed     0x6ffffffe /* Versions needed by file */
446
#define SHT_GNU_verneed             SHT_SUNW_verneed
447
#define SHT_SUNW_versym             0x6fffffff /* Symbol versions */
448
#define SHT_GNU_versym             SHT_SUNW_versym
449
#define        SHT_HISUNW             0x6fffffff
450
#define SHT_HIOS             0x6fffffff
451
#define SHT_LOPROC             0x70000000 /* Processor-specific range */
452
#define SHT_AMD64_UNWIND     0x70000001 /* unwind information */
453
#define SHT_ARM_EXIDX             0x70000001        /* exception index table */
454
#define SHT_ARM_PREEMPTMAP   0x70000002 /* BPABI DLL dynamic linking 
455
                                         * pre-emption map */
456
#define SHT_ARM_ATTRIBUTES   0x70000003 /* Object file compatibility 
457
                                         * attributes */
458
#define SHT_ARM_DEBUGOVERLAY 0x70000004 /* See DBGOVL for details */
459
#define SHT_ARM_OVERLAYSECTION 0x70000005
460
#define        SHT_MIPS_REGINFO     0x70000006
461
#define        SHT_MIPS_OPTIONS     0x7000000d
462
#define        SHT_MIPS_DWARF             0x7000001e        /* MIPS gcc uses MIPS_DWARF */
463
#define SHT_HIPROC             0x7fffffff
464
#define SHT_LOUSER             0x80000000 /* Application-specific range */
465
#define SHT_HIUSER             0xffffffff
466

    
467
/* sh_flags */
468
#define SHF_WRITE             0x00000001 /* Contains writable data */
469
#define SHF_ALLOC             0x00000002 /* Occupies memory */
470
#define SHF_EXECINSTR             0x00000004 /* Contains executable insns */
471
#define SHF_MERGE             0x00000010 /* Might be merged */
472
#define SHF_STRINGS             0x00000020 /* Contains nul terminated strings */
473
#define SHF_INFO_LINK             0x00000040 /* "sh_info" contains SHT index */
474
#define SHF_LINK_ORDER             0x00000080 /* Preserve order after combining */
475
#define SHF_OS_NONCONFORMING 0x00000100 /* OS specific handling required */
476
#define SHF_GROUP             0x00000200 /* Is member of a group */
477
#define SHF_TLS                     0x00000400 /* Holds thread-local data */
478
#define SHF_MASKOS             0x0ff00000 /* Operating system specific values */
479
#define SHF_MASKPROC             0xf0000000 /* Processor-specific values */
480
#define SHF_ORDERED             0x40000000 /* Ordering requirement (Solaris) */
481
#define SHF_EXCLUDE             0x80000000 /* Excluded unless unles ref/alloc
482
                                           (Solaris).*/
483
/*
484
 * Symbol Table
485
 */
486
typedef struct {
487
        Elf32_Word        st_name;        /* Symbol name (.strtab index) */
488
        Elf32_Word        st_value;        /* value of symbol */
489
        Elf32_Word        st_size;        /* size of symbol */
490
        Elf_Byte        st_info;        /* type / binding attrs */
491
        Elf_Byte        st_other;        /* unused */
492
        Elf32_Half        st_shndx;        /* section index of symbol */
493
} Elf32_Sym;
494

    
495
typedef struct {
496
        Elf64_Word        st_name;        /* Symbol name (.strtab index) */
497
        Elf_Byte        st_info;        /* type / binding attrs */
498
        Elf_Byte        st_other;        /* unused */
499
        Elf64_Half        st_shndx;        /* section index of symbol */
500
        Elf64_Addr        st_value;        /* value of symbol */
501
        Elf64_Xword        st_size;        /* size of symbol */
502
} Elf64_Sym;
503

    
504
/* Symbol Table index of the undefined symbol */
505
#define ELF_SYM_UNDEFINED        0
506

    
507
#define STN_UNDEF                0        /* undefined index */
508

    
509
/* st_info: Symbol Bindings */
510
#define STB_LOCAL                0        /* local symbol */
511
#define STB_GLOBAL                1        /* global symbol */
512
#define STB_WEAK                2        /* weakly defined global symbol */
513
#define STB_NUM                        3
514

    
515
#define STB_LOOS                10        /* Operating system specific range */
516
#define STB_HIOS                12
517
#define STB_LOPROC                13        /* Processor-specific range */
518
#define STB_HIPROC                15
519

    
520
/* st_info: Symbol Types */
521
#define STT_NOTYPE                0        /* Type not specified */
522
#define STT_OBJECT                1        /* Associated with a data object */
523
#define STT_FUNC                2        /* Associated with a function */
524
#define STT_SECTION                3        /* Associated with a section */
525
#define STT_FILE                4        /* Associated with a file name */
526
#define STT_COMMON                5        /* Uninitialised common block */
527
#define STT_TLS                        6        /* Thread local data object */
528
#define STT_NUM                        7
529

    
530
#define STT_LOOS                10        /* Operating system specific range */
531
#define STT_GNU_IFUNC                10        /* GNU extension: indirect function */
532
#define STT_HIOS                12
533
#define STT_LOPROC                13        /* Processor-specific range */
534
#define STT_HIPROC                15
535

    
536
/* st_other: Visibility Types */
537
#define STV_DEFAULT                0        /* use binding type */
538
#define STV_INTERNAL                1        /* not referenced from outside */
539
#define STV_HIDDEN                2        /* not visible, may be used via ptr */
540
#define STV_PROTECTED                3        /* visible, not preemptible */
541
#define STV_EXPORTED                4
542
#define STV_SINGLETON                5
543
#define STV_ELIMINATE                6
544

    
545
/* st_info/st_other utility macros */
546
#define ELF_ST_BIND(info)                ((uint32_t)(info) >> 4)
547
#define ELF_ST_TYPE(info)                ((uint32_t)(info) & 0xf)
548
#define ELF_ST_INFO(bind,type)                ((Elf_Byte)(((bind) << 4) | \
549
                                         ((type) & 0xf)))
550
#define ELF_ST_VISIBILITY(other)        ((uint32_t)(other) & 3)
551

    
552
/*
553
 * Special section indexes
554
 */
555
#define SHN_UNDEF        0                /* Undefined section */
556

    
557
#define SHN_LORESERVE        0xff00                /* Reserved range */
558
#define SHN_ABS                0xfff1                /*  Absolute symbols */
559
#define SHN_COMMON        0xfff2                /*  Common symbols */
560
#define SHN_XINDEX        0xffff                /* Escape -- index stored elsewhere */
561
#define SHN_HIRESERVE        0xffff
562

    
563
#define SHN_LOPROC        0xff00                /* Processor-specific range */
564
#define SHN_HIPROC        0xff1f
565
#define SHN_LOOS        0xff20                /* Operating system specific range */
566
#define SHN_HIOS        0xff3f
567

    
568
#define SHN_MIPS_ACOMMON 0xff00
569
#define SHN_MIPS_TEXT        0xff01
570
#define SHN_MIPS_DATA        0xff02
571
#define SHN_MIPS_SCOMMON 0xff03
572

    
573
/*
574
 * Relocation Entries
575
 */
576
typedef struct {
577
        Elf32_Word        r_offset;        /* where to do it */
578
        Elf32_Word        r_info;                /* index & type of relocation */
579
} Elf32_Rel;
580

    
581
typedef struct {
582
        Elf32_Word        r_offset;        /* where to do it */
583
        Elf32_Word        r_info;                /* index & type of relocation */
584
        Elf32_Sword        r_addend;        /* adjustment value */
585
} Elf32_Rela;
586

    
587
/* r_info utility macros */
588
#define ELF32_R_SYM(info)        ((info) >> 8)
589
#define ELF32_R_TYPE(info)        ((info) & 0xff)
590
#define ELF32_R_INFO(sym, type) (((sym) << 8) + (unsigned char)(type))
591

    
592
typedef struct {
593
        Elf64_Addr        r_offset;        /* where to do it */
594
        Elf64_Xword        r_info;                /* index & type of relocation */
595
} Elf64_Rel;
596

    
597
typedef struct {
598
        Elf64_Addr        r_offset;        /* where to do it */
599
        Elf64_Xword        r_info;                /* index & type of relocation */
600
        Elf64_Sxword        r_addend;        /* adjustment value */
601
} Elf64_Rela;
602

    
603
/* r_info utility macros */
604
#define ELF64_R_SYM(info)        ((info) >> 32)
605
#define ELF64_R_TYPE(info)        ((info) & 0xffffffff)
606
#define ELF64_R_INFO(sym,type)        (((sym) << 32) + (type))
607

    
608
/*
609
 * Move entries
610
 */
611
typedef struct {
612
        Elf32_Lword        m_value;        /* symbol value */
613
        Elf32_Word        m_info;                /* size + index */
614
        Elf32_Word        m_poffset;        /* symbol offset */
615
        Elf32_Half        m_repeat;        /* repeat count */
616
        Elf32_Half        m_stride;        /* stride info */
617
} Elf32_Move;
618

    
619
#define ELF32_M_SYM(info)        ((info) >> 8)
620
#define ELF32_M_SIZE(info)        ((info) & 0xff)
621
#define ELF32_M_INFO(sym, size) (((sym) << 8) + (unsigned char)(size))
622

    
623
typedef struct {
624
        Elf64_Lword        m_value;        /* symbol value */
625
        Elf64_Xword        m_info;                /* size + index */
626
        Elf64_Xword        m_poffset;        /* symbol offset */
627
        Elf64_Word        m_repeat;        /* repeat count */
628
        Elf64_Word        m_stride;        /* stride info */
629
} Elf64_Move;
630

    
631
#define ELF64_M_SYM(info)        ((info) >> 8)
632
#define ELF64_M_SIZE(info)        ((info) & 0xff)
633
#define ELF64_M_INFO(sym, size) (((sym) << 8) + (unsigned char)(size))
634

    
635
/*
636
 * Hardware/software capabilities entry
637
 */
638
typedef struct {
639
        Elf32_Word                c_tag;        /* entry tag value */
640
        union {
641
                Elf32_Addr        c_ptr;
642
                Elf32_Word        c_val;
643
        } c_un;
644
} Elf32_Cap;
645

    
646
typedef struct {
647
        Elf64_Xword                c_tag;        /* entry tag value */
648
        union {
649
                Elf64_Addr        c_ptr;
650
                Elf64_Xword        c_val;
651
        } c_un;
652
} Elf64_Cap;
653

    
654
/*
655
 * Dynamic Section structure array
656
 */
657
typedef struct {
658
        Elf32_Word                d_tag;        /* entry tag value */
659
        union {
660
                Elf32_Addr        d_ptr;
661
                Elf32_Word        d_val;
662
        } d_un;
663
} Elf32_Dyn;
664

    
665
typedef struct {
666
        Elf64_Xword                d_tag;        /* entry tag value */
667
        union {
668
                Elf64_Addr        d_ptr;
669
                Elf64_Xword        d_val;
670
        } d_un;
671
} Elf64_Dyn;
672

    
673
/* d_tag */
674
#define DT_NULL                0        /* Marks end of dynamic array */
675
#define DT_NEEDED        1        /* Name of needed library (DT_STRTAB offset) */
676
#define DT_PLTRELSZ        2        /* Size, in bytes, of relocations in PLT */
677
#define DT_PLTGOT        3        /* Address of PLT and/or GOT */
678
#define DT_HASH                4        /* Address of symbol hash table */
679
#define DT_STRTAB        5        /* Address of string table */
680
#define DT_SYMTAB        6        /* Address of symbol table */
681
#define DT_RELA                7        /* Address of Rela relocation table */
682
#define DT_RELASZ        8        /* Size, in bytes, of DT_RELA table */
683
#define DT_RELAENT        9        /* Size, in bytes, of one DT_RELA entry */
684
#define DT_STRSZ        10        /* Size, in bytes, of DT_STRTAB table */
685
#define DT_SYMENT        11        /* Size, in bytes, of one DT_SYMTAB entry */
686
#define DT_INIT                12        /* Address of initialization function */
687
#define DT_FINI                13        /* Address of termination function */
688
#define DT_SONAME        14        /* Shared object name (DT_STRTAB offset) */
689
#define DT_RPATH        15        /* Library search path (DT_STRTAB offset) */
690
#define DT_SYMBOLIC        16        /* Start symbol search within local object */
691
#define DT_REL                17        /* Address of Rel relocation table */
692
#define DT_RELSZ        18        /* Size, in bytes, of DT_REL table */
693
#define DT_RELENT        19        /* Size, in bytes, of one DT_REL entry */
694
#define DT_PLTREL        20        /* Type of PLT relocation entries */
695
#define DT_DEBUG        21        /* Used for debugging; unspecified */
696
#define DT_TEXTREL        22        /* Relocations might modify non-writable seg */
697
#define DT_JMPREL        23        /* Address of relocations associated with PLT */
698
#define DT_BIND_NOW        24        /* Process all relocations at load-time */
699
#define DT_INIT_ARRAY        25        /* Address of initialization function array */
700
#define DT_FINI_ARRAY        26        /* Size, in bytes, of DT_INIT_ARRAY array */
701
#define DT_INIT_ARRAYSZ 27        /* Address of termination function array */
702
#define DT_FINI_ARRAYSZ 28        /* Size, in bytes, of DT_FINI_ARRAY array*/
703
#define DT_RUNPATH        29        /* overrides DT_RPATH */
704
#define DT_FLAGS        30        /* Encodes ORIGIN, SYMBOLIC, TEXTREL, BIND_NOW, STATIC_TLS */
705
#define DT_ENCODING        31        /* ??? */
706
#define DT_PREINIT_ARRAY 32        /* Address of pre-init function array */
707
#define DT_PREINIT_ARRAYSZ 33        /* Size, in bytes, of DT_PREINIT_ARRAY array */
708
#define DT_NUM                34
709

    
710
#define DT_LOOS                0x60000000        /* Operating system specific range */
711
#define DT_VERSYM        0x6ffffff0        /* Symbol versions */
712
#define DT_FLAGS_1        0x6ffffffb        /* ELF dynamic flags */
713
#define DT_VERDEF        0x6ffffffc        /* Versions defined by file */
714
#define DT_VERDEFNUM        0x6ffffffd        /* Number of versions defined by file */
715
#define DT_VERNEED        0x6ffffffe        /* Versions needed by file */
716
#define DT_VERNEEDNUM        0x6fffffff        /* Number of versions needed by file */
717
#define DT_HIOS                0x6fffffff
718
#define DT_LOPROC        0x70000000        /* Processor-specific range */
719
#define DT_HIPROC        0x7fffffff
720

    
721
/* Flag values for DT_FLAGS */
722
#define DF_ORIGIN        0x00000001        /* uses $ORIGIN */
723
#define DF_SYMBOLIC        0x00000002        /* */
724
#define DF_TEXTREL        0x00000004        /* */
725
#define DF_BIND_NOW        0x00000008        /* */
726
#define DF_STATIC_TLS        0x00000010        /* */
727

    
728
/* Flag values for DT_FLAGS_1 (incomplete) */
729
#define DF_1_BIND_NOW        0x00000001        /* Same as DF_BIND_NOW */
730
#define DF_1_NODELETE        0x00000008        /* Set the RTLD_NODELETE for object */
731
#define DF_1_INITFIRST        0x00000020        /* Object's init/fini take priority */
732
#define DF_1_NOOPEN        0x00000040        /* Do not allow loading on dlopen() */
733

    
734
/*
735
 * Auxiliary Vectors
736
 */
737
typedef struct {
738
        Elf32_Word        a_type;                                /* 32-bit id */
739
        Elf32_Word        a_v;                                /* 32-bit id */
740
} Aux32Info;
741

    
742
typedef struct {
743
        Elf64_Word        a_type;                /* 32-bit id */
744
        Elf64_Xword        a_v;                /* 64-bit id */
745
} Aux64Info;
746

    
747
/* a_type */
748
#define AT_NULL                0        /* Marks end of array */
749
#define AT_IGNORE        1        /* No meaning, a_un is undefined */
750
#define AT_EXECFD        2        /* Open file descriptor of object file */
751
#define AT_PHDR                3        /* &phdr[0] */
752
#define AT_PHENT        4        /* sizeof(phdr[0]) */
753
#define AT_PHNUM        5        /* # phdr entries */
754
#define AT_PAGESZ        6        /* PAGESIZE */
755
#define AT_BASE                7        /* Interpreter base addr */
756
#define AT_FLAGS        8        /* Processor flags */
757
#define AT_ENTRY        9        /* Entry address of executable */
758
#define AT_DCACHEBSIZE        10        /* Data cache block size */
759
#define AT_ICACHEBSIZE        11        /* Instruction cache block size */
760
#define AT_UCACHEBSIZE        12        /* Unified cache block size */
761
#define AT_STACKBASE        13        /* Base address of the main thread */
762

    
763
        /* Vendor specific */
764
#define AT_MIPS_NOTELF        10        /* XXX a_val != 0 -> MIPS XCOFF executable */
765

    
766
#define AT_EUID                2000        /* euid (solaris compatible numbers) */
767
#define AT_RUID                2001        /* ruid (solaris compatible numbers) */
768
#define AT_EGID                2002        /* egid (solaris compatible numbers) */
769
#define AT_RGID                2003        /* rgid (solaris compatible numbers) */
770

    
771
        /* Solaris kernel specific */
772
#define AT_SUN_LDELF        2004        /* dynamic linker's ELF header */
773
#define AT_SUN_LDSHDR        2005        /* dynamic linker's section header */
774
#define AT_SUN_LDNAME        2006        /* dynamic linker's name */
775
#define AT_SUN_LPGSIZE        2007        /* large pagesize */
776

    
777
        /* Other information */
778
#define AT_SUN_PLATFORM 2008        /* sysinfo(SI_PLATFORM) */
779
#define AT_SUN_HWCAP        2009        /* process hardware capabilities */
780
#define AT_SUN_IFLUSH        2010        /* do we need to flush the instruction cache? */
781
#define AT_SUN_CPU        2011        /* CPU name */
782
        /* ibcs2 emulation band aid */
783
#define AT_SUN_EMUL_ENTRY 2012        /* coff entry point */
784
#define AT_SUN_EMUL_EXECFD 2013 /* coff file descriptor */
785
        /* Executable's fully resolved name */
786
#define AT_SUN_EXECNAME 2014
787

    
788
/*
789
 * The header for GNU-style hash sections.
790
 */
791
typedef struct {
792
        uint32_t        gh_nbuckets;        /* Number of hash buckets. */
793
        uint32_t        gh_symndx;        /* First visible symbol in .dynsym. */
794
        uint32_t        gh_maskwords;        /* #maskwords used in bloom filter. */
795
        uint32_t        gh_shift2;        /* Bloom filter shift count. */
796
} Elf_GNU_Hash_Header;
797

    
798
/*
799
 * Note Headers
800
 */
801
typedef struct {
802
        Elf32_Word n_namesz;
803
        Elf32_Word n_descsz;
804
        Elf32_Word n_type;
805
} Elf32_Nhdr;
806

    
807
typedef struct {
808
        Elf64_Word n_namesz;
809
        Elf64_Word n_descsz;
810
        Elf64_Word n_type;
811
} Elf64_Nhdr;
812

    
813
#define ELF_NOTE_GNU_NAMESZ                4
814
#define ELF_NOTE_GNU_NAME                "GNU\0"
815

    
816
/*
817
 * GNU-specific note type: ABI tag
818
 * name: GNU\0
819
 * namesz: 4
820
 * desc:
821
 *        word[0]: OS tag
822
 *        word[1]: major version
823
 *        word[2]: minor version
824
 *        word[3]: teeny version
825
 * descsz: 16
826
 */
827
/* GNU-specific note name and description sizes */
828
#define ELF_NOTE_TYPE_ABI_TAG                1
829
#define ELF_NOTE_ABI_NAME                ELF_NOTE_GNU_NAME
830
#define ELF_NOTE_ABI_NAMESZ                ELF_NOTE_GNU_NAMESZ
831
#define ELF_NOTE_ABI_DESCSZ                16
832
/* GNU-specific OS/version value stuff */
833
#define ELF_NOTE_ABI_OS_LINUX                0
834
#define ELF_NOTE_ABI_OS_HURD                1
835
#define ELF_NOTE_ABI_OS_SOLARIS                2
836
#define ELF_NOTE_ABI_OS_KFREEBSD        3
837
#define ELF_NOTE_ABI_OS_KNETBSD                4
838

    
839
/*
840
 * GNU-specific note type: Hardware capabilities
841
 * name: GNU\0
842
 * namesz: 4
843
 * desc:
844
 *        word[0]: Number of entries
845
 *        word[1]: Bitmask of enabled entries
846
 *        Followed by a byte id, and a NUL terminated string per entry
847
 * descsz: variable
848
 */
849
#define ELF_NOTE_TYPE_GNU_HWCAP                2
850

    
851
/*
852
 * GNU-specific note type: Build ID generated by ld
853
 * name: GNU\0
854
 * desc:
855
 *        word[0..4] SHA1 [default] 
856
 * or
857
 *        word[0..3] md5 or uuid
858
 * descsz: 16 or 20
859
 */
860
#define ELF_NOTE_TYPE_GNU_BUILD_ID        3
861

    
862
/* SuSE-specific note type: ABI
863
 * name: SuSE\0
864
 * namesz: 5
865
 * desc:
866
 *        half[0] = MMmm
867
 *
868
 *        M = product major version
869
 *        m = product minor version
870
 * descsz: 2
871
 */
872
#define ELF_NOTE_TYPE_SUSE_TAG        1
873
/* SuSE-specific note name and description sizes */
874
#define ELF_NOTE_SUSE_NAMESZ        5
875
#define ELF_NOTE_SUSE_DESCSZ        2
876
/* SuSE-specific note name */
877
#define ELF_NOTE_SUSE_NAME                "SuSE\0"
878

    
879
/* SuSE-specific note type: version
880
 * name: SuSE\0\0\0\0
881
 * namesz: 8
882
 * desc: 
883
 *        word[0] = VVTTMMmm
884
 *
885
 *        V = version of following data
886
 *        T = product type: [box, sles, nld, whatever]
887
 *        M = product major version
888
 *        m = product minor version
889
 * descsz: 8
890
 */
891
#define ELF_NOTE_TYPE_SUSE_VERSION_TAG        0x45537553        /* SuSE in LE */
892
/* SuSE-specific note name and description sizes */
893
#define ELF_NOTE_SUSE_VERSION_NAMESZ        8
894
#define ELF_NOTE_SUSE_VERSION_DESCSZ        8
895
/* SuSE-specific note name */
896
#define ELF_NOTE_SUSE_VERSION_NAME                "SuSE\0\0\0\0"
897

    
898
/* NetBSD-specific note type: Emulation name.
899
 * name: NetBSD\0\0
900
 * namesz: 8
901
 * desc: 
902
 *        word[0]: MMmmrrpp00
903
 *
904
 *        M = major version
905
 *        m = minor version
906
 *        r = release ["",A-Z,Z[A-Z] but numeric]
907
 *        p = patchlevel
908
 * descsz: 4
909
 */
910
#define ELF_NOTE_TYPE_NETBSD_TAG        1
911
#if defined(__minix)
912
/* NetBSD-specific note name and description sizes */
913
#define ELF_NOTE_NETBSD_NAMESZ                7
914
#define ELF_NOTE_NETBSD_DESCSZ                4
915
/* NetBSD-specific note name */
916
#define ELF_NOTE_NETBSD_NAME                "NetBSD\0\0"
917
#else
918
/* MINIX3-specific note name and description sizes */
919
#define ELF_NOTE_NETBSD_NAMESZ                6
920
#define ELF_NOTE_NETBSD_DESCSZ                4
921
#define ELF_NOTE_NETBSD_NAME                "Minix\0\0\0"
922
#endif /* defined(__minix) */
923

    
924
/* NetBSD-specific note type: Checksum. 
925
 * There should be 1 NOTE per PT_LOAD section.
926
 * name: ???
927
 * namesz: ???
928
 * desc:
929
 *        a tuple of <phnum>(16),<chk-type>(16),<chk-value>.
930
 * descsz: ???
931
 */
932
#define ELF_NOTE_TYPE_CHECKSUM_TAG        2
933
#define ELF_NOTE_CHECKSUM_CRC32                1
934
#define ELF_NOTE_CHECKSUM_MD5                2
935
#define ELF_NOTE_CHECKSUM_SHA1                3
936
#define ELF_NOTE_CHECKSUM_SHA256        4
937

    
938
/*
939
 * NetBSD-specific note type: PaX.
940
 * There should be 1 NOTE per executable.
941
 * name: PaX\0
942
 * namesz: 4
943
 * desc:
944
 *        word[0]: capability bitmask
945
 * descsz: 4
946
 */
947
#define ELF_NOTE_TYPE_PAX_TAG                3
948
#define ELF_NOTE_PAX_MPROTECT                0x01        /* Force enable Mprotect */
949
#define ELF_NOTE_PAX_NOMPROTECT                0x02        /* Force disable Mprotect */
950
#define ELF_NOTE_PAX_GUARD                0x04        /* Force enable Segvguard */
951
#define ELF_NOTE_PAX_NOGUARD                0x08        /* Force disable Segvguard */
952
#define ELF_NOTE_PAX_ASLR                0x10        /* Force enable ASLR */
953
#define ELF_NOTE_PAX_NOASLR                0x20        /* Force disable ASLR */
954
#define ELF_NOTE_PAX_NAMESZ                4
955
#define ELF_NOTE_PAX_NAME                "PaX\0"
956
#define ELF_NOTE_PAX_DESCSZ                4
957

    
958
/*
959
 * NetBSD-specific core file information.
960
 *
961
 * NetBSD ELF core files use notes to provide information about
962
 * the process's state.         The note name is "NetBSD-CORE" for
963
 * information that is global to the process, and "NetBSD-CORE@nn",
964
 * where "nn" is the lwpid of the LWP that the information belongs
965
 * to (such as register state).
966
 *
967
 * We use the following note identifiers:
968
 *
969
 *        ELF_NOTE_NETBSD_CORE_PROCINFO
970
 *                Note is a "netbsd_elfcore_procinfo" structure.
971
 *
972
 * We also use ptrace(2) request numbers (the ones that exist in
973
 * machine-dependent space) to identify register info notes.  The
974
 * info in such notes is in the same format that ptrace(2) would
975
 * export that information.
976
 *
977
 * Please try to keep the members of this structure nicely aligned,
978
 * and if you add elements, add them to the end and bump the version.
979
 */
980

    
981
#define ELF_NOTE_NETBSD_CORE_NAME        "NetBSD-CORE"
982

    
983
#define ELF_NOTE_NETBSD_CORE_PROCINFO        1
984

    
985
#define NETBSD_ELFCORE_PROCINFO_VERSION 1
986

    
987
struct netbsd_elfcore_procinfo {
988
        /* Version 1 fields start here. */
989
        uint32_t        cpi_version;                /* our version */
990
        uint32_t        cpi_cpisize;                /* sizeof(this struct) */
991
        uint32_t        cpi_signo;                /* killing signal */
992
        uint32_t        cpi_sigcode;                /* signal code */
993
        uint32_t        cpi_sigpend[4];                /* pending signals */
994
        uint32_t        cpi_sigmask[4];                /* blocked signals */
995
        uint32_t        cpi_sigignore[4];        /* ignored signals */
996
        uint32_t        cpi_sigcatch[4];        /* caught signals */
997
        int32_t                cpi_pid;                /* process ID */
998
        int32_t                cpi_ppid;                /* parent process ID */
999
        int32_t                cpi_pgrp;                /* process group ID */
1000
        int32_t                cpi_sid;                /* session ID */
1001
        uint32_t        cpi_ruid;                /* real user ID */
1002
        uint32_t        cpi_euid;                /* effective user ID */
1003
        uint32_t        cpi_svuid;                /* saved user ID */
1004
        uint32_t        cpi_rgid;                /* real group ID */
1005
        uint32_t        cpi_egid;                /* effective group ID */
1006
        uint32_t        cpi_svgid;                /* saved group ID */
1007
        uint32_t        cpi_nlwps;                /* number of LWPs */
1008
        int8_t                cpi_name[32];                /* copy of p->p_comm */
1009
        /* Add version 2 fields below here. */
1010
        int32_t                cpi_siglwp;        /* LWP target of killing signal */
1011
};
1012

    
1013
/*
1014
 * NetBSD-specific note type: MACHINE_ARCH.
1015
 * There should be 1 NOTE per executable.
1016
 * name:        NetBSD\0
1017
 * namesz:        7
1018
 * desc:        string
1019
 * descsz:        variable
1020
 */
1021
#define ELF_NOTE_TYPE_MARCH_TAG                5
1022
/* NetBSD-specific note name and description sizes */
1023
#define ELF_NOTE_MARCH_NAMESZ                ELF_NOTE_NETBSD_NAMESZ
1024
/* NetBSD-specific note name */
1025
#define ELF_NOTE_MARCH_NAME                ELF_NOTE_NETBSD_NAME
1026

    
1027
/*
1028
 * NetBSD-specific note type: MCMODEL
1029
 * There should be 1 NOTE per executable.
1030
 * name:        NetBSD\0
1031
 * namesz:        7
1032
 * code model:        string
1033
 */
1034

    
1035
#define ELF_NOTE_TYPE_MCMODEL_TAG        6
1036
/* NetBSD-specific note name and description sizes */
1037
#define ELF_NOTE_MCMODEL_NAMESZ                ELF_NOTE_NETBSD_NAMESZ
1038
/* NetBSD-specific note name */
1039
#define ELF_NOTE_MCMODEL_NAME                ELF_NOTE_NETBSD_NAME
1040

    
1041

    
1042
#if !defined(ELFSIZE) && defined(ARCH_ELFSIZE)
1043
#define ELFSIZE ARCH_ELFSIZE
1044
#endif
1045

    
1046
#if defined(ELFSIZE)
1047
#define CONCAT(x,y)        __CONCAT(x,y)
1048
#define ELFNAME(x)        CONCAT(elf,CONCAT(ELFSIZE,CONCAT(_,x)))
1049
#define ELFNAME2(x,y)        CONCAT(x,CONCAT(_elf,CONCAT(ELFSIZE,CONCAT(_,y))))
1050
#define ELFNAMEEND(x)        CONCAT(x,CONCAT(_elf,ELFSIZE))
1051
#define ELFDEFNNAME(x)        CONCAT(ELF,CONCAT(ELFSIZE,CONCAT(_,x)))
1052
#endif
1053

    
1054
#if defined(ELFSIZE) && (ELFSIZE == 32)
1055
#define Elf_Ehdr        Elf32_Ehdr
1056
#define Elf_Phdr        Elf32_Phdr
1057
#define Elf_Shdr        Elf32_Shdr
1058
#define Elf_Sym                Elf32_Sym
1059
#define Elf_Rel                Elf32_Rel
1060
#define Elf_Rela        Elf32_Rela
1061
#define Elf_Dyn                Elf32_Dyn
1062
#define Elf_Word        Elf32_Word
1063
#define Elf_Sword        Elf32_Sword
1064
#define Elf_Half        Elf32_Half
1065
#define Elf_Addr        Elf32_Addr
1066
#define Elf_Off                Elf32_Off
1067
#define Elf_SOff        Elf32_SOff
1068
#define Elf_Nhdr        Elf32_Nhdr
1069
#define Elf_Verdef        Elf32_Verdef
1070
#define Elf_Verdaux        Elf32_Verdaux
1071
#define Elf_Verneed        Elf32_Verneed
1072
#define Elf_Vernaux        Elf32_Vernaux
1073
#define Elf_Versym        Elf32_Versym
1074

    
1075
#define ELF_R_SYM        ELF32_R_SYM
1076
#define ELF_R_TYPE        ELF32_R_TYPE
1077
#define ELFCLASS        ELFCLASS32
1078

    
1079
#define AuxInfo                Aux32Info
1080
#elif defined(ELFSIZE) && (ELFSIZE == 64)
1081
#define Elf_Ehdr        Elf64_Ehdr
1082
#define Elf_Phdr        Elf64_Phdr
1083
#define Elf_Shdr        Elf64_Shdr
1084
#define Elf_Sym                Elf64_Sym
1085
#define Elf_Rel                Elf64_Rel
1086
#define Elf_Rela        Elf64_Rela
1087
#define Elf_Dyn                Elf64_Dyn
1088
#define Elf_Word        Elf64_Word
1089
#define Elf_Sword        Elf64_Sword
1090
#define Elf_Half        Elf64_Half
1091
#define Elf_Addr        Elf64_Addr
1092
#define Elf_Off                Elf64_Off
1093
#define Elf_SOff        Elf64_SOff
1094
#define Elf_Nhdr        Elf64_Nhdr
1095
#define Elf_Verdef        Elf64_Verdef
1096
#define Elf_Verdaux        Elf64_Verdaux
1097
#define Elf_Verneed        Elf64_Verneed
1098
#define Elf_Vernaux        Elf64_Vernaux
1099
#define Elf_Versym        Elf64_Versym
1100

    
1101
#define ELF_R_SYM        ELF64_R_SYM
1102
#define ELF_R_TYPE        ELF64_R_TYPE
1103
#define ELFCLASS        ELFCLASS64
1104

    
1105
#define AuxInfo                Aux64Info
1106
#endif
1107

    
1108
#ifndef Elf_Symindx
1109
#define Elf_Symindx        uint32_t
1110
#endif
1111

    
1112
#define ELF32_ST_BIND(info)                ELF_ST_BIND(info)
1113
#define ELF32_ST_TYPE(info)                ELF_ST_TYPE(info)
1114
#define ELF32_ST_INFO(bind,type)        ELF_ST_INFO(bind,type)
1115
#define ELF32_ST_VISIBILITY(other)        ELF_ST_VISIBILITY(other)
1116

    
1117
#define ELF64_ST_BIND(info)                ELF_ST_BIND(info)
1118
#define ELF64_ST_TYPE(info)                ELF_ST_TYPE(info)
1119
#define ELF64_ST_INFO(bind,type)        ELF_ST_INFO(bind,type)
1120
#define ELF64_ST_VISIBILITY(other)        ELF_ST_VISIBILITY(other)
1121

    
1122
typedef struct {
1123
        Elf32_Half        si_boundto;        /* direct bindings - symbol bound to */
1124
        Elf32_Half        si_flags;        /* per symbol flags */
1125
} Elf32_Syminfo;
1126

    
1127
typedef struct {
1128
        Elf64_Word        si_boundto;        /* direct bindings - symbol bound to */
1129
        Elf64_Word        si_flags;        /* per symbol flags */
1130
} Elf64_Syminfo;
1131

    
1132
#define SYMINFO_FLG_DIRECT        0x0001        /* symbol ref has direct association
1133
                                           to object containing definition */
1134
#define SYMINFO_FLG_PASSTHRU        0x0002        /* ignored - see SYMINFO_FLG_FILTER */
1135
#define SYMINFO_FLG_COPY        0x0004        /* symbol is a copy-reloc */
1136
#define SYMINFO_FLG_LAZYLOAD        0x0008        /* object containing defn should be
1137
                                           lazily-loaded */
1138
#define SYMINFO_FLG_DIRECTBIND        0x0010        /* ref should be bound directly to
1139
                                           object containing definition */
1140
#define SYMINFO_FLG_NOEXTDIRECT 0x0020        /* don't let an external reference
1141
                                           directly bind to this symbol */
1142
#define SYMINFO_FLG_FILTER        0x0002        /* symbol ref is associated to a */
1143
#define SYMINFO_FLG_AUXILIARY        0x0040        /*        standard or auxiliary filter */
1144

    
1145
#define SYMINFO_BT_SELF                0xffff        /* symbol bound to self */
1146
#define SYMINFO_BT_PARENT        0xfffe        /* symbol bound to parent */
1147
#define SYMINFO_BT_NONE                0xfffd        /* no special symbol binding */
1148
#define SYMINFO_BT_EXTERN        0xfffc        /* symbol defined as external */
1149
#define SYMINFO_BT_LOWRESERVE        0xff00        /* beginning of reserved entries */
1150

    
1151
#define SYMINFO_NONE                0        /* Syminfo version */
1152
#define SYMINFO_CURRENT                1
1153
#define SYMINFO_NUM                2
1154

    
1155
/*
1156
 * These constants are used for Elf32_Verdef struct's version number.  
1157
 */
1158
#define VER_DEF_NONE                0
1159
#define VER_DEF_CURRENT                1
1160

    
1161
/*
1162
 * These constants are used for Elf32_Verdef struct's vd_ndx.
1163
 */
1164
#define VER_DEF_IDX(x)                VER_NDX(x)
1165

    
1166
/*
1167
 * These constants are used for Elf32_Verdef struct's vd_flags.         
1168
 */
1169
#define VER_FLG_BASE                0x1
1170
#define VER_FLG_WEAK                0x2
1171

    
1172
/*
1173
 * These are used in an Elf32_Versym field.
1174
 */
1175
#define VER_NDX_LOCAL                0
1176
#define VER_NDX_GLOBAL                1
1177
#define VER_NDX_GIVEN                2
1178

    
1179
/*
1180
 * These constants are used for Elf32_Verneed struct's version number.        
1181
 */
1182
#define VER_NEED_NONE                0
1183
#define VER_NEED_CURRENT        1
1184

    
1185
/*
1186
 * These constants are used for Elf32_Vernaux struct's vna_other.
1187
 */
1188
#define VER_NEED_HIDDEN                VER_NDX_HIDDEN
1189
#define VER_NEED_IDX(x)                VER_NDX(x)
1190

    
1191
/* index */
1192
#define VER_NDX_HIDDEN                0x8000
1193
#define VER_NDX(x)                ((x) & ~VER_NDX_HIDDEN)
1194

    
1195
/*
1196
 * GNU Extension hidding symbol
1197
 */
1198
#define VERSYM_HIDDEN                0x8000
1199
#define VERSYM_VERSION                0x7fff
1200

    
1201
#define ELF_VER_CHR                '@'
1202

    
1203
/*
1204
 * These are current size independent.
1205
 */
1206

    
1207
typedef struct {
1208
        Elf32_Half        vd_version;        /* version number of structure */
1209
        Elf32_Half        vd_flags;        /* flags (VER_FLG_*) */
1210
        Elf32_Half        vd_ndx;                /* version index */
1211
        Elf32_Half        vd_cnt;                /* number of verdaux entries */
1212
        Elf32_Word        vd_hash;        /* hash of name */
1213
        Elf32_Word        vd_aux;                /* offset to verdaux entries */
1214
        Elf32_Word        vd_next;        /* offset to next verdef */
1215
} Elf32_Verdef;
1216
typedef Elf32_Verdef        Elf64_Verdef;
1217

    
1218
typedef struct {
1219
        Elf32_Word        vda_name;        /* string table offset of name */
1220
        Elf32_Word        vda_next;        /* offset to verdaux */
1221
} Elf32_Verdaux;
1222
typedef Elf32_Verdaux        Elf64_Verdaux;
1223

    
1224
typedef struct {
1225
        Elf32_Half        vn_version;        /* version number of structure */
1226
        Elf32_Half        vn_cnt;                /* number of vernaux entries */
1227
        Elf32_Word        vn_file;        /* string table offset of library name*/
1228
        Elf32_Word        vn_aux;                /* offset to vernaux entries */
1229
        Elf32_Word        vn_next;        /* offset to next verneed */
1230
} Elf32_Verneed;
1231
typedef Elf32_Verneed        Elf64_Verneed;
1232

    
1233
typedef struct {
1234
        Elf32_Word        vna_hash;        /* Hash of dependency name */
1235
        Elf32_Half        vna_flags;        /* flags (VER_FLG_*) */
1236
        Elf32_Half        vna_other;        /* unused */
1237
        Elf32_Word        vna_name;        /* string table offset to version name*/
1238
        Elf32_Word        vna_next;        /* offset to next vernaux */
1239
} Elf32_Vernaux;
1240
typedef Elf32_Vernaux        Elf64_Vernaux;
1241

    
1242
typedef struct {
1243
        Elf32_Half        vs_vers;
1244
} Elf32_Versym;
1245
typedef Elf32_Versym        Elf64_Versym;
1246

    
1247
#ifdef _KERNEL
1248

    
1249
/*
1250
 * Arbitrary limits to avoid DoS for excessive memory allocation.
1251
 */
1252
#define ELF_MAXPHNUM        128
1253
#define ELF_MAXSHNUM        32768
1254
#define ELF_MAXNOTESIZE        1024
1255

    
1256
#define ELF_AUX_ENTRIES 15        /* Max size of aux array passed to loader */
1257
#define ELF32_NO_ADDR        (~(Elf32_Addr)0) /* Indicates addr. not yet filled in */
1258
#define ELF32_LINK_ADDR ((Elf32_Addr)-2) /* advises to use link address */
1259
#define ELF64_NO_ADDR        (~(Elf64_Addr)0) /* Indicates addr. not yet filled in */
1260
#define ELF64_LINK_ADDR ((Elf64_Addr)-2) /* advises to use link address */
1261

    
1262
#if defined(ELFSIZE) && (ELFSIZE == 64)
1263
#define ELF_NO_ADDR        ELF64_NO_ADDR
1264
#define ELF_LINK_ADDR        ELF64_LINK_ADDR
1265
#elif defined(ELFSIZE) && (ELFSIZE == 32)
1266
#define ELF_NO_ADDR        ELF32_NO_ADDR
1267
#define ELF_LINK_ADDR        ELF32_LINK_ADDR
1268
#endif
1269

    
1270
#ifndef ELF32_EHDR_FLAGS_OK
1271
#define ELF32_EHDR_FLAGS_OK(eh) 1
1272
#endif
1273

    
1274
#ifndef ELF64_EHDR_FLAGS_OK
1275
#define ELF64_EHDR_FLAGS_OK(eh) 1
1276
#endif
1277

    
1278
#if defined(ELFSIZE) && (ELFSIZE == 64)
1279
#define ELF_EHDR_FLAGS_OK(eh)        ELF64_EHDR_FLAGS_OK(eh)
1280
#else
1281
#define ELF_EHDR_FLAGS_OK(eh)        ELF32_EHDR_FLAGS_OK(eh)
1282
#endif
1283

    
1284
#if defined(ELFSIZE)
1285
struct elf_args {
1286
        Elf_Addr        arg_entry;        /* program entry point */
1287
        Elf_Addr        arg_interp;        /* Interpreter load address */
1288
        Elf_Addr        arg_phaddr;        /* program header address */
1289
        Elf_Addr        arg_phentsize;        /* Size of program header */
1290
        Elf_Addr        arg_phnum;        /* Number of program headers */
1291
};
1292
#endif
1293

    
1294
#ifdef _KERNEL_OPT
1295
#include "opt_execfmt.h"
1296
#endif
1297

    
1298
struct ps_strings;
1299
struct coredump_iostate;
1300
struct note_state;
1301
struct exec_package;
1302

    
1303
#ifdef EXEC_ELF32
1304
int        exec_elf32_makecmds(struct lwp *, struct exec_package *);
1305
int        elf32_copyargs(struct lwp *, struct exec_package *,
1306
    struct ps_strings *, char **, void *);
1307

    
1308
int        coredump_elf32(struct lwp *, struct coredump_iostate *);
1309
void        coredump_savenote_elf32(struct note_state *, unsigned int,
1310
            const char *, void *, size_t);
1311

    
1312
int        elf32_check_header(Elf32_Ehdr *);
1313
#endif
1314

    
1315
#ifdef EXEC_ELF64
1316
int        exec_elf64_makecmds(struct lwp *, struct exec_package *);
1317
int        elf64_copyargs(struct lwp *, struct exec_package *,
1318
    struct ps_strings *, char **, void *);
1319

    
1320
int        coredump_elf64(struct lwp *, struct coredump_iostate *);
1321
void        coredump_savenote_elf64(struct note_state *, unsigned int,
1322
            const char *, void *, size_t);
1323

    
1324
int        elf64_check_header(Elf64_Ehdr *);
1325
#endif
1326

    
1327
#endif /* _KERNEL */
1328

    
1329
#endif /* !_SYS_EXEC_ELF_H_ */