resetting manifest requested domain to floor
[platform/upstream/libelf0.git] / lib / elf_repl.h
1 /*
2  * elf_repl.h - public header file for systems that lack it.
3  * Copyright (C) 1995 - 2006 Michael Riepe
4  * 
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Library General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  * 
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Library General Public License for more details.
14  * 
15  * You should have received a copy of the GNU Library General Public
16  * License along with this library; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
18  */
19
20 /* @(#) $Id: elf_repl.h,v 1.22 2009/11/01 13:04:19 michael Exp $ */
21
22 /*
23  * NEVER INCLUDE THIS FILE DIRECTLY - USE <libelf.h> INSTEAD!
24  */
25
26 #ifndef _ELF_REPL_H
27 #define _ELF_REPL_H
28
29 #ifdef __cplusplus
30 extern "C" {
31 #endif /* __cplusplus */
32
33 /*
34  * Scalar data types
35  */
36 typedef __libelf_u32_t          Elf32_Addr;
37 typedef __libelf_u16_t          Elf32_Half;
38 typedef __libelf_u32_t          Elf32_Off;
39 typedef __libelf_i32_t          Elf32_Sword;
40 typedef __libelf_u32_t          Elf32_Word;
41
42 #define ELF32_FSZ_ADDR          4
43 #define ELF32_FSZ_HALF          2
44 #define ELF32_FSZ_OFF           4
45 #define ELF32_FSZ_SWORD         4
46 #define ELF32_FSZ_WORD          4
47
48 #if __LIBELF64
49
50 typedef __libelf_u64_t          Elf64_Addr;
51 typedef __libelf_u16_t          Elf64_Half;
52 typedef __libelf_u64_t          Elf64_Off;
53 typedef __libelf_i32_t          Elf64_Sword;
54 typedef __libelf_u32_t          Elf64_Word;
55 typedef __libelf_i64_t          Elf64_Sxword;
56 typedef __libelf_u64_t          Elf64_Xword;
57
58 #define ELF64_FSZ_ADDR          8
59 #define ELF64_FSZ_HALF          2
60 #define ELF64_FSZ_OFF           8
61 #define ELF64_FSZ_SWORD         4
62 #define ELF64_FSZ_WORD          4
63 #define ELF64_FSZ_SXWORD        8
64 #define ELF64_FSZ_XWORD         8
65
66 /*
67  * Blame Sun for this...
68  */
69 typedef __libelf_u64_t          Elf64_Lword;
70 typedef __libelf_u64_t          Elf32_Lword;
71
72 #endif /* __LIBELF64 */
73
74 /*
75  * ELF header
76  */
77 #define EI_NIDENT       16
78
79 typedef struct {
80     unsigned char       e_ident[EI_NIDENT];
81     Elf32_Half          e_type;
82     Elf32_Half          e_machine;
83     Elf32_Word          e_version;
84     Elf32_Addr          e_entry;
85     Elf32_Off           e_phoff;
86     Elf32_Off           e_shoff;
87     Elf32_Word          e_flags;
88     Elf32_Half          e_ehsize;
89     Elf32_Half          e_phentsize;
90     Elf32_Half          e_phnum;
91     Elf32_Half          e_shentsize;
92     Elf32_Half          e_shnum;
93     Elf32_Half          e_shstrndx;
94 } Elf32_Ehdr;
95
96 #if __LIBELF64
97 typedef struct {
98     unsigned char       e_ident[EI_NIDENT];
99     Elf64_Half          e_type;
100     Elf64_Half          e_machine;
101     Elf64_Word          e_version;
102     Elf64_Addr          e_entry;
103     Elf64_Off           e_phoff;
104     Elf64_Off           e_shoff;
105     Elf64_Word          e_flags;
106     Elf64_Half          e_ehsize;
107     Elf64_Half          e_phentsize;
108     Elf64_Half          e_phnum;
109     Elf64_Half          e_shentsize;
110     Elf64_Half          e_shnum;
111     Elf64_Half          e_shstrndx;
112 } Elf64_Ehdr;
113 #endif /* __LIBELF64 */
114
115 /*
116  * e_ident
117  */
118 #define EI_MAG0         0
119 #define EI_MAG1         1
120 #define EI_MAG2         2
121 #define EI_MAG3         3
122 #define EI_CLASS        4
123 #define EI_DATA         5
124 #define EI_VERSION      6
125 #define EI_OSABI        7
126 #define EI_ABIVERSION   8
127 #define EI_PAD          9
128
129 #define ELFMAG0         0x7f
130 #define ELFMAG1         'E'
131 #define ELFMAG2         'L'
132 #define ELFMAG3         'F'
133 #define ELFMAG          "\177ELF"
134 #define SELFMAG         4
135
136 /*
137  * e_ident[EI_CLASS]
138  */
139 #define ELFCLASSNONE    0
140 #define ELFCLASS32      1
141 #define ELFCLASS64      2
142 #define ELFCLASSNUM     3
143
144 /*
145  * e_ident[EI_DATA]
146  */
147 #define ELFDATANONE     0
148 #define ELFDATA2LSB     1
149 #define ELFDATA2MSB     2
150 #define ELFDATANUM      3
151
152 /*
153  * e_ident[EI_OSABI]
154  */
155 #define ELFOSABI_NONE           0       /* No extensions or unspecified */
156 #define ELFOSABI_SYSV           ELFOSABI_NONE
157 #define ELFOSABI_HPUX           1       /* Hewlett-Packard HP-UX */
158 #define ELFOSABI_NETBSD         2       /* NetBSD */
159 #define ELFOSABI_LINUX          3       /* Linux */
160 #define ELFOSABI_SOLARIS        6       /* Sun Solaris */
161 #define ELFOSABI_AIX            7       /* AIX */
162 #define ELFOSABI_IRIX           8       /* IRIX */
163 #define ELFOSABI_FREEBSD        9       /* FreeBSD */
164 #define ELFOSABI_TRU64          10      /* Compaq TRU64 UNIX */
165 #define ELFOSABI_MODESTO        11      /* Novell Modesto */
166 #define ELFOSABI_OPENBSD        12      /* Open BSD */
167 #define ELFOSABI_OPENVMS        13      /* Open VMS */
168 #define ELFOSABI_NSK            14      /* Hewlett-Packard Non-Stop Kernel */
169 #define ELFOSABI_AROS           15      /* Amiga Research OS */
170 /* these are probably obsolete: */
171 #define ELFOSABI_ARM            97      /* ARM */
172 #define ELFOSABI_STANDALONE     255     /* standalone (embedded) application */
173
174
175 /*
176  * e_type
177  */
178 #define ET_NONE         0
179 #define ET_REL          1
180 #define ET_EXEC         2
181 #define ET_DYN          3
182 #define ET_CORE         4
183 #define ET_NUM          5
184 #define ET_LOOS         0xfe00
185 #define ET_HIOS         0xfeff
186 #define ET_LOPROC       0xff00
187 #define ET_HIPROC       0xffff
188
189 /*
190  * e_machine
191  */
192 #define EM_NONE         0       /* No machine */
193 #define EM_M32          1       /* AT&T WE 32100 */
194 #define EM_SPARC        2       /* SPARC */
195 #define EM_386          3       /* Intel 80386 */
196 #define EM_68K          4       /* Motorola 68000 */
197 #define EM_88K          5       /* Motorola 88000 */
198 #define EM_486          6       /* Intel i486 (DO NOT USE THIS ONE) */
199 #define EM_860          7       /* Intel 80860 */
200 #define EM_MIPS         8       /* MIPS I Architecture */
201 #define EM_S370         9       /* IBM System/370 Processor */
202 #define EM_MIPS_RS3_LE  10      /* MIPS RS3000 Little-endian */
203 #define EM_SPARC64      11      /* SPARC 64-bit */
204 #define EM_PARISC       15      /* Hewlett-Packard PA-RISC */
205 #define EM_VPP500       17      /* Fujitsu VPP500 */
206 #define EM_SPARC32PLUS  18      /* Enhanced instruction set SPARC */
207 #define EM_960          19      /* Intel 80960 */
208 #define EM_PPC          20      /* PowerPC */
209 #define EM_PPC64        21      /* 64-bit PowerPC */
210 #define EM_S390         22      /* IBM System/390 Processor */
211 #define EM_V800         36      /* NEC V800 */
212 #define EM_FR20         37      /* Fujitsu FR20 */
213 #define EM_RH32         38      /* TRW RH-32 */
214 #define EM_RCE          39      /* Motorola RCE */
215 #define EM_ARM          40      /* Advanced RISC Machines ARM */
216 #define EM_ALPHA        41      /* Digital Alpha */
217 #define EM_SH           42      /* Hitachi SH */
218 #define EM_SPARCV9      43      /* SPARC Version 9 */
219 #define EM_TRICORE      44      /* Siemens TriCore embedded processor */
220 #define EM_ARC          45      /* Argonaut RISC Core, Argonaut Technologies Inc. */
221 #define EM_H8_300       46      /* Hitachi H8/300 */
222 #define EM_H8_300H      47      /* Hitachi H8/300H */
223 #define EM_H8S          48      /* Hitachi H8S */
224 #define EM_H8_500       49      /* Hitachi H8/500 */
225 #define EM_IA_64        50      /* Intel IA-64 processor architecture */
226 #define EM_MIPS_X       51      /* Stanford MIPS-X */
227 #define EM_COLDFIRE     52      /* Motorola ColdFire */
228 #define EM_68HC12       53      /* Motorola M68HC12 */
229 #define EM_MMA          54      /* Fujitsu MMA Multimedia Accelerator */
230 #define EM_PCP          55      /* Siemens PCP */
231 #define EM_NCPU         56      /* Sony nCPU embedded RISC processor */
232 #define EM_NDR1         57      /* Denso NDR1 microprocessor */
233 #define EM_STARCORE     58      /* Motorola Star*Core processor */
234 #define EM_ME16         59      /* Toyota ME16 processor */
235 #define EM_ST100        60      /* STMicroelectronics ST100 processor */
236 #define EM_TINYJ        61      /* Advanced Logic Corp. TinyJ embedded processor family */
237 #define EM_X86_64       62      /* AMD x86-64 architecture */
238 #define EM_AMD64        EM_X86_64
239 #define EM_PDSP         63      /* Sony DSP Processor */
240 #define EM_FX66         66      /* Siemens FX66 microcontroller */
241 #define EM_ST9PLUS      67      /* STMicroelectronics ST9+ 8/16 bit microcontroller */
242 #define EM_ST7          68      /* STMicroelectronics ST7 8-bit microcontroller */
243 #define EM_68HC16       69      /* Motorola MC68HC16 Microcontroller */
244 #define EM_68HC11       70      /* Motorola MC68HC11 Microcontroller */
245 #define EM_68HC08       71      /* Motorola MC68HC08 Microcontroller */
246 #define EM_68HC05       72      /* Motorola MC68HC05 Microcontroller */
247 #define EM_SVX          73      /* Silicon Graphics SVx */
248 #define EM_ST19         74      /* STMicroelectronics ST19 8-bit microcontroller */
249 #define EM_VAX          75      /* Digital VAX */
250 #define EM_CRIS         76      /* Axis Communications 32-bit embedded processor */
251 #define EM_JAVELIN      77      /* Infineon Technologies 32-bit embedded processor */
252 #define EM_FIREPATH     78      /* Element 14 64-bit DSP Processor */
253 #define EM_ZSP          79      /* LSI Logic 16-bit DSP Processor */
254 #define EM_MMIX         80      /* Donald Knuth's educational 64-bit processor */
255 #define EM_HUANY        81      /* Harvard University machine-independent object files */
256 #define EM_PRISM        82      /* SiTera Prism */
257 #define EM_AVR          83      /* Atmel AVR 8-bit microcontroller */
258 #define EM_FR30         84      /* Fujitsu FR30 */
259 #define EM_D10V         85      /* Mitsubishi D10V */
260 #define EM_D30V         86      /* Mitsubishi D30V */
261 #define EM_V850         87      /* NEC v850 */
262 #define EM_M32R         88      /* Mitsubishi M32R */
263 #define EM_MN10300      89      /* Matsushita MN10300 */
264 #define EM_MN10200      90      /* Matsushita MN10200 */
265 #define EM_PJ           91      /* picoJava */
266 #define EM_OPENRISC     92      /* OpenRISC 32-bit embedded processor */
267 #define EM_ARC_A5       93      /* ARC Cores Tangent-A5 */
268 #define EM_XTENSA       94      /* Tensilica Xtensa Architecture */
269 #define EM_VIDEOCORE    95      /* Alphamosaic VideoCore processor */
270 #define EM_TMM_GPP      96      /* Thompson Multimedia General Purpose Processor */
271 #define EM_NS32K        97      /* National Semiconductor 32000 series */
272 #define EM_TPC          98      /* Tenor Network TPC processor */
273 #define EM_SNP1K        99      /* Trebia SNP 1000 processor */
274 #define EM_ST200        100     /* STMicroelectronics (www.st.com) ST200 microcontroller */
275 #define EM_IP2K         101     /* Ubicom IP2xxx microcontroller family */
276 #define EM_MAX          102     /* MAX Processor */
277 #define EM_CR           103     /* National Semiconductor CompactRISC microprocessor */
278 #define EM_F2MC16       104     /* Fujitsu F2MC16 */
279 #define EM_MSP430       105     /* Texas Instruments embedded microcontroller msp430 */
280 #define EM_BLACKFIN     106     /* Analog Devices Blackfin (DSP) processor */
281 #define EM_SE_C33       107     /* S1C33 Family of Seiko Epson processors */
282 #define EM_SEP          108     /* Sharp embedded microprocessor */
283 #define EM_ARCA         109     /* Arca RISC Microprocessor */
284 #define EM_UNICORE      110     /* Microprocessor series from PKU-Unity Ltd. and MPRC of Peking University */
285 #define EM_NUM          111
286
287 /*
288  * e_ident[EI_VERSION], e_version
289  */
290 #define EV_NONE         0
291 #define EV_CURRENT      1
292 #define EV_NUM          2
293
294 /*
295  * Section header
296  */
297 typedef struct {
298     Elf32_Word          sh_name;
299     Elf32_Word          sh_type;
300     Elf32_Word          sh_flags;
301     Elf32_Addr          sh_addr;
302     Elf32_Off           sh_offset;
303     Elf32_Word          sh_size;
304     Elf32_Word          sh_link;
305     Elf32_Word          sh_info;
306     Elf32_Word          sh_addralign;
307     Elf32_Word          sh_entsize;
308 } Elf32_Shdr;
309
310 #if __LIBELF64
311 typedef struct {
312     Elf64_Word          sh_name;
313     Elf64_Word          sh_type;
314     Elf64_Xword         sh_flags;
315     Elf64_Addr          sh_addr;
316     Elf64_Off           sh_offset;
317     Elf64_Xword         sh_size;
318     Elf64_Word          sh_link;
319     Elf64_Word          sh_info;
320     Elf64_Xword         sh_addralign;
321     Elf64_Xword         sh_entsize;
322 } Elf64_Shdr;
323 #endif /* __LIBELF64 */
324
325 /*
326  * Special section indices
327  */
328 #define SHN_UNDEF       0
329 #define SHN_LORESERVE   0xff00
330 #define SHN_LOPROC      0xff00
331 #define SHN_HIPROC      0xff1f
332 #define SHN_LOOS        0xff20
333 #define SHN_HIOS        0xff3f
334 #define SHN_ABS         0xfff1
335 #define SHN_COMMON      0xfff2
336 #define SHN_XINDEX      0xffff
337 #define SHN_HIRESERVE   0xffff
338
339 /*
340  * sh_type
341  */
342 #define SHT_NULL                0
343 #define SHT_PROGBITS            1
344 #define SHT_SYMTAB              2
345 #define SHT_STRTAB              3
346 #define SHT_RELA                4
347 #define SHT_HASH                5
348 #define SHT_DYNAMIC             6
349 #define SHT_NOTE                7
350 #define SHT_NOBITS              8
351 #define SHT_REL                 9
352 #define SHT_SHLIB               10
353 #define SHT_DYNSYM              11
354 #define SHT_INIT_ARRAY          14
355 #define SHT_FINI_ARRAY          15
356 #define SHT_PREINIT_ARRAY       16
357 #define SHT_GROUP               17
358 #define SHT_SYMTAB_SHNDX        18
359 #define SHT_NUM                 19
360 #define SHT_LOOS                0x60000000
361 #define SHT_HIOS                0x6fffffff
362 #define SHT_LOPROC              0x70000000
363 #define SHT_HIPROC              0x7fffffff
364 #define SHT_LOUSER              0x80000000
365 #define SHT_HIUSER              0xffffffff
366
367 /*
368  * Solaris extensions
369  */
370 #define SHT_LOSUNW              0x6ffffff4
371 #define SHT_SUNW_dof            0x6ffffff4
372 #define SHT_SUNW_cap            0x6ffffff5
373 #define SHT_SUNW_SIGNATURE      0x6ffffff6
374 #define SHT_SUNW_ANNOTATE       0x6ffffff7
375 #define SHT_SUNW_DEBUGSTR       0x6ffffff8
376 #define SHT_SUNW_DEBUG          0x6ffffff9
377 #define SHT_SUNW_move           0x6ffffffa
378 #define SHT_SUNW_COMDAT         0x6ffffffb
379 #define SHT_SUNW_syminfo        0x6ffffffc
380 #define SHT_SUNW_verdef         0x6ffffffd
381 #define SHT_SUNW_verneed        0x6ffffffe
382 #define SHT_SUNW_versym         0x6fffffff
383 #define SHT_HISUNW              0x6fffffff
384
385 #define SHT_SPARC_GOTDATA       0x70000000
386 #define SHT_AMD64_UNWIND        0x70000001 
387
388 /*
389  * GNU extensions
390  */
391 #define SHT_GNU_verdef          0x6ffffffd
392 #define SHT_GNU_verneed         0x6ffffffe
393 #define SHT_GNU_versym          0x6fffffff
394
395 /*
396  * sh_flags
397  */
398 #define SHF_WRITE               0x1
399 #define SHF_ALLOC               0x2
400 #define SHF_EXECINSTR           0x4
401 #define SHF_MERGE               0x10
402 #define SHF_STRINGS             0x20
403 #define SHF_INFO_LINK           0x40
404 #define SHF_LINK_ORDER          0x80
405 #define SHF_OS_NONCONFORMING    0x100
406 #define SHF_GROUP               0x200
407 #define SHF_TLS                 0x400
408 #define SHF_MASKOS              0x0ff00000
409 #define SHF_MASKPROC            0xf0000000
410
411 /*
412  * Solaris extensions
413  */
414 #define SHF_AMD64_LARGE         0x10000000
415 #define SHF_ORDERED             0x40000000
416 #define SHF_EXCLUDE             0x80000000
417
418 /*
419  * Section group flags
420  */
421 #define GRP_COMDAT              0x1
422 #define GRP_MASKOS              0x0ff00000
423 #define GRP_MASKPROC            0xf0000000
424
425 /*
426  * Symbol table
427  */
428 typedef struct {
429     Elf32_Word          st_name;
430     Elf32_Addr          st_value;
431     Elf32_Word          st_size;
432     unsigned char       st_info;
433     unsigned char       st_other;
434     Elf32_Half          st_shndx;
435 } Elf32_Sym;
436
437 #if __LIBELF64
438 typedef struct {
439     Elf64_Word          st_name;
440     unsigned char       st_info;
441     unsigned char       st_other;
442     Elf64_Half          st_shndx;
443     Elf64_Addr          st_value;
444     Elf64_Xword         st_size;
445 } Elf64_Sym;
446 #endif /* __LIBELF64 */
447
448 /*
449  * Special symbol indices
450  */
451 #define STN_UNDEF       0
452
453 /*
454  * Macros for manipulating st_info
455  */
456 #define ELF32_ST_BIND(i)        ((i)>>4)
457 #define ELF32_ST_TYPE(i)        ((i)&0xf)
458 #define ELF32_ST_INFO(b,t)      (((b)<<4)+((t)&0xf))
459
460 #if __LIBELF64
461 #define ELF64_ST_BIND(i)        ((i)>>4)
462 #define ELF64_ST_TYPE(i)        ((i)&0xf)
463 #define ELF64_ST_INFO(b,t)      (((b)<<4)+((t)&0xf))
464 #endif /* __LIBELF64 */
465
466 /*
467  * Symbol binding
468  */
469 #define STB_LOCAL       0
470 #define STB_GLOBAL      1
471 #define STB_WEAK        2
472 #define STB_NUM         3
473 #define STB_LOOS        10
474 #define STB_HIOS        12
475 #define STB_LOPROC      13
476 #define STB_HIPROC      15
477
478 /*
479  * Symbol types
480  */
481 #define STT_NOTYPE      0
482 #define STT_OBJECT      1
483 #define STT_FUNC        2
484 #define STT_SECTION     3
485 #define STT_FILE        4
486 #define STT_COMMON      5
487 #define STT_TLS         6
488 #define STT_NUM         7
489 #define STT_LOOS        10
490 #define STT_HIOS        12
491 #define STT_LOPROC      13
492 #define STT_HIPROC      15
493
494 /*
495  * Macros for manipulating st_other
496  */
497 #define ELF32_ST_VISIBILITY(o)  ((o)&0x3)
498 #if __LIBELF64
499 #define ELF64_ST_VISIBILITY(o)  ((o)&0x3)
500 #endif /* __LIBELF64 */
501
502 /*
503  * Symbol visibility
504  */
505 #define STV_DEFAULT     0
506 #define STV_INTERNAL    1
507 #define STV_HIDDEN      2
508 #define STV_PROTECTED   3
509
510 /*
511  * Relocation
512  */
513 typedef struct {
514     Elf32_Addr          r_offset;
515     Elf32_Word          r_info;
516 } Elf32_Rel;
517
518 typedef struct {
519     Elf32_Addr          r_offset;
520     Elf32_Word          r_info;
521     Elf32_Sword         r_addend;
522 } Elf32_Rela;
523
524 #if __LIBELF64
525 typedef struct {
526     Elf64_Addr          r_offset;
527     Elf64_Xword         r_info;
528 } Elf64_Rel;
529
530 typedef struct {
531     Elf64_Addr          r_offset;
532     Elf64_Xword         r_info;
533     Elf64_Sxword        r_addend;
534 } Elf64_Rela;
535 #endif /* __LIBELF64 */
536
537 /*
538  * Macros for manipulating r_info
539  */
540 #define ELF32_R_SYM(i)          ((i)>>8)
541 #define ELF32_R_TYPE(i)         ((unsigned char)(i))
542 #define ELF32_R_INFO(s,t)       (((s)<<8)+(unsigned char)(t))
543
544 #if __LIBELF64
545 #define ELF64_R_SYM(i)          ((Elf64_Xword)(i)>>32)
546 #define ELF64_R_TYPE(i)         ((i)&0xffffffffL)
547 #define ELF64_R_INFO(s,t)       (((Elf64_Xword)(s)<<32)+((t)&0xffffffffL))
548 #endif /* __LIBELF64 */
549
550 /*
551  * Note entry header
552  */
553 typedef struct {
554     Elf32_Word          n_namesz;       /* name size */
555     Elf32_Word          n_descsz;       /* descriptor size */
556     Elf32_Word          n_type;         /* descriptor type */
557 } Elf32_Nhdr;
558
559 #if __LIBELF64
560 /* Solaris and GNU use this layout.  Be compatible. */
561 /* XXX: Latest ELF specs say it's 64-bit!!! */
562 typedef struct {
563     Elf64_Word          n_namesz;       /* name size */
564     Elf64_Word          n_descsz;       /* descriptor size */
565     Elf64_Word          n_type;         /* descriptor type */
566 } Elf64_Nhdr;
567 #endif /* __LIBELF64 */
568
569 /*
570  * Well-known descriptor types for ET_CORE files
571  */
572 #define NT_PRSTATUS     1
573 #define NT_PRFPREG      2
574 #define NT_PRPSINFO     3
575
576 /*
577  * Program header
578  */
579 typedef struct {
580     Elf32_Word          p_type;
581     Elf32_Off           p_offset;
582     Elf32_Addr          p_vaddr;
583     Elf32_Addr          p_paddr;
584     Elf32_Word          p_filesz;
585     Elf32_Word          p_memsz;
586     Elf32_Word          p_flags;
587     Elf32_Word          p_align;
588 } Elf32_Phdr;
589
590 #if __LIBELF64
591 typedef struct {
592     Elf64_Word          p_type;
593     Elf64_Word          p_flags;
594     Elf64_Off           p_offset;
595     Elf64_Addr          p_vaddr;
596     Elf64_Addr          p_paddr;
597     Elf64_Xword         p_filesz;
598     Elf64_Xword         p_memsz;
599     Elf64_Xword         p_align;
600 } Elf64_Phdr;
601 #endif /* __LIBELF64 */
602
603 /*
604  * Special numbers
605  */
606 #define PN_XNUM         0xffff
607
608 /*
609  * p_type
610  */
611 #define PT_NULL         0
612 #define PT_LOAD         1
613 #define PT_DYNAMIC      2
614 #define PT_INTERP       3
615 #define PT_NOTE         4
616 #define PT_SHLIB        5
617 #define PT_PHDR         6
618 #define PT_TLS          7
619 #define PT_NUM          8
620 #define PT_LOOS         0x60000000
621 #define PT_HIOS         0x6fffffff
622 #define PT_LOPROC       0x70000000
623 #define PT_HIPROC       0x7fffffff
624
625 /*
626  * Solaris extensions
627  */
628
629 #define PT_SUNW_UNWIND  0x6464e550
630 #define PT_LOSUNW       0x6ffffffa
631 #define PT_SUNWBSS      0x6ffffffa
632 #define PT_SUNWSTACK    0x6ffffffb
633 #define PT_SUNWDTRACE   0x6ffffffc
634 #define PT_SUNWCAP      0x6ffffffd
635 #define PT_HISUNW       0x6fffffff 
636
637 /*
638  * p_flags
639  */
640 #define PF_X            0x1
641 #define PF_W            0x2
642 #define PF_R            0x4
643 #define PF_MASKOS       0x0ff00000
644 #define PF_MASKPROC     0xf0000000
645
646 /*
647  * Dynamic structure
648  */
649 typedef struct {
650     Elf32_Sword         d_tag;
651     union {
652         Elf32_Word      d_val;
653         Elf32_Addr      d_ptr;
654     } d_un;
655 } Elf32_Dyn;
656
657 #if __LIBELF64
658 typedef struct {
659     Elf64_Sxword        d_tag;
660     union {
661         Elf64_Xword     d_val;
662         Elf64_Addr      d_ptr;
663     } d_un;
664 } Elf64_Dyn;
665 #endif /* __LIBELF64 */
666
667 /*
668  * Dynamic array tags
669  */
670                                         /* d_un   exec   shared */
671 #define DT_NULL                 0       /* ign.   mand.  mand. */
672 #define DT_NEEDED               1       /* d_val  opt.   opt.  */
673 #define DT_PLTRELSZ             2       /* d_val  opt.   opt.  */
674 #define DT_PLTGOT               3       /* d_ptr  opt.   opt.  */
675 #define DT_HASH                 4       /* d_ptr  mand.  mand. */
676 #define DT_STRTAB               5       /* d_ptr  mand.  mand. */
677 #define DT_SYMTAB               6       /* d_ptr  mand.  mand. */
678 #define DT_RELA                 7       /* d_ptr  mand.  opt.  */
679 #define DT_RELASZ               8       /* d_val  mand.  opt.  */
680 #define DT_RELAENT              9       /* d_val  mand.  opt.  */
681 #define DT_STRSZ                10      /* d_val  mand.  mand. */
682 #define DT_SYMENT               11      /* d_val  mand.  mand. */
683 #define DT_INIT                 12      /* d_ptr  opt.   opt.  */
684 #define DT_FINI                 13      /* d_ptr  opt.   opt.  */
685 #define DT_SONAME               14      /* d_val  ign.   opt.  */
686 #define DT_RPATH                15      /* d_val  opt.   ign.  */
687 #define DT_SYMBOLIC             16      /* ign.   ign.   opt.  */
688 #define DT_REL                  17      /* d_ptr  mand.  opt.  */
689 #define DT_RELSZ                18      /* d_val  mand.  opt.  */
690 #define DT_RELENT               19      /* d_val  mand.  opt.  */
691 #define DT_PLTREL               20      /* d_val  opt.   opt.  */
692 #define DT_DEBUG                21      /* d_ptr  opt.   ign.  */
693 #define DT_TEXTREL              22      /* ign.   opt.   opt.  */
694 #define DT_JMPREL               23      /* d_ptr  opt.   opt.  */
695 #define DT_BIND_NOW             24      /* ign.   opt.   opt.  */
696 #define DT_INIT_ARRAY           25      /* d_ptr  opt.   opt.  */
697 #define DT_FINI_ARRAY           26      /* d_ptr  opt.   opt.  */
698 #define DT_INIT_ARRAYSZ         27      /* d_val  opt.   opt.  */
699 #define DT_FINI_ARRAYSZ         28      /* d_val  opt.   opt.  */
700 #define DT_RUNPATH              29      /* d_val  opt.   opt.  */
701 #define DT_FLAGS                30      /* d_val  opt.   opt.  */
702 #define DT_ENCODING             32      /* odd/even encoding rule starts here */
703 #define DT_PREINIT_ARRAY        32      /* d_ptr  opt.   ign.  */
704 #define DT_PREINIT_ARRAYSZ      33      /* d_val  opt.   ign.  */
705 #define DT_NUM                  34
706 #define DT_LOOS                 0x6000000D
707 #define DT_HIOS                 0x6ffff000
708 #define DT_LOPROC               0x70000000
709 #define DT_HIPROC               0x7fffffff
710
711 /*
712  * DT_FLAGS values
713  */
714 #define DF_ORIGIN       0x1
715 #define DF_SYMBOLIC     0x2
716 #define DF_TEXTREL      0x4
717 #define DF_BIND_NOW     0x8
718 #define DF_STATIC_TLS   0x10
719
720 /*
721  * Solaris extensions
722  */
723 #define DT_VALRNGLO     0x6ffffd00
724 #define DT_CHECKSUM     0x6ffffdf8
725 #define DT_PLTPADSZ     0x6ffffdf9
726 #define DT_MOVEENT      0x6ffffdfa
727 #define DT_MOVESZ       0x6ffffdfb
728 #define DT_FEATURE_1    0x6ffffdfc
729 #define DT_POSFLAG_1    0x6ffffdfd
730 #define DT_SYMINSZ      0x6ffffdfe
731 #define DT_SYMINENT     0x6ffffdff
732 #define DT_VALRNGHI     0x6ffffdff
733
734 #define DT_ADDRRNGLO    0x6ffffe00
735 #define DT_CONFIG       0x6ffffefa
736 #define DT_DEPAUDIT     0x6ffffefb
737 #define DT_AUDIT        0x6ffffefc
738 #define DT_PLTPAD       0x6ffffefd
739 #define DT_MOVETAB      0x6ffffefe
740 #define DT_SYMINFO      0x6ffffeff
741 #define DT_ADDRRNGHI    0x6ffffeff
742
743 #define DT_RELACOUNT    0x6ffffff9
744 #define DT_RELCOUNT     0x6ffffffa
745 #define DT_FLAGS_1      0x6ffffffb
746 #define DT_VERDEF       0x6ffffffc
747 #define DT_VERDEFNUM    0x6ffffffd
748 #define DT_VERNEED      0x6ffffffe
749 #define DT_VERNEEDNUM   0x6fffffff
750
751 #define DT_AUXILIARY    0x7ffffffd
752 #define DT_USED         0x7ffffffe
753 #define DT_FILTER       0x7fffffff
754
755 /*
756  * GNU extensions
757  */
758 #define DT_VERSYM       0x6ffffff0
759
760 /*
761  * DT_FEATURE_1 values
762  */
763 #define DTF_1_PARINIT   0x1
764 #define DTF_1_CONFEXP   0x2
765
766 /*
767  * DT_POSFLAG_1 values
768  */
769 #define DF_P1_LAZYLOAD  0x1
770 #define DF_P1_GROUPPERM 0x2
771
772 /*
773  * DT_FLAGS_1 values
774  */
775 #define DF_1_NOW        0x00000001
776 #define DF_1_GLOBAL     0x00000002
777 #define DF_1_GROUP      0x00000004
778 #define DF_1_NODELETE   0x00000008
779 #define DF_1_LOADFLTR   0x00000010
780 #define DF_1_INITFIRST  0x00000020
781 #define DF_1_NOOPEN     0x00000040
782 #define DF_1_ORIGIN     0x00000080
783 #define DF_1_DIRECT     0x00000100
784 #define DF_1_TRANS      0x00000200
785 #define DF_1_INTERPOSE  0x00000400
786 #define DF_1_NODEFLIB   0x00000800
787 #define DF_1_NODUMP     0x00001000
788 #define DF_1_CONFALT    0x00002000
789 #define DF_1_ENDFILTEE  0x00004000
790 #define DF_1_DISPRELDNE 0x00008000
791 #define DF_1_DISPRELPND 0x00010000
792
793 /*
794  * Syminfo structure
795  */
796 typedef struct {
797     Elf32_Half          si_boundto;
798     Elf32_Half          si_flags;
799 } Elf32_Syminfo;
800
801 #if __LIBELF64
802 typedef struct {
803     Elf64_Half          si_boundto;
804     Elf64_Half          si_flags;
805 } Elf64_Syminfo;
806 #endif /* __LIBELF64 */
807
808 /*
809  * Syminfo version (stored in unused first entry)
810  */
811 #define SYMINFO_NONE    0
812 #define SYMINFO_CURRENT 1
813 #define SYMINFO_NUM     2
814
815 /*
816  * si_boundto special values
817  */
818 #define SYMINFO_BT_LOWRESERVE   0xff00
819 #define SYMINFO_BT_PARENT       0xfffe  /* bound to parent */
820 #define SYMINFO_BT_SELF         0xffff  /* bound to self */
821
822 /*
823  * si_flags
824  */
825 #define SYMINFO_FLG_DIRECT      0x01    /* bound to an object */
826 #define SYMINFO_FLG_PASSTHRU    0x02    /* pass-thru symbol */
827 #define SYMINFO_FLG_COPY        0x04    /* result of a copy relocation */
828 #define SYMINFO_FLG_LAZYLOAD    0x08    /* bound to lazy-loaded object */
829
830 /*
831  * Version definitions
832  */
833 typedef struct {
834     Elf32_Half          vd_version;
835     Elf32_Half          vd_flags;
836     Elf32_Half          vd_ndx;
837     Elf32_Half          vd_cnt;
838     Elf32_Word          vd_hash;
839     Elf32_Word          vd_aux;
840     Elf32_Word          vd_next;
841 } Elf32_Verdef;
842
843 typedef struct {
844     Elf32_Word          vda_name;
845     Elf32_Word          vda_next;
846 } Elf32_Verdaux;
847
848 typedef struct {
849     Elf32_Half          vn_version;
850     Elf32_Half          vn_cnt;
851     Elf32_Word          vn_file;
852     Elf32_Word          vn_aux;
853     Elf32_Word          vn_next;
854 } Elf32_Verneed;
855
856 typedef struct {
857     Elf32_Word          vna_hash;
858     Elf32_Half          vna_flags;
859     Elf32_Half          vna_other;
860     Elf32_Word          vna_name;
861     Elf32_Word          vna_next;
862 } Elf32_Vernaux;
863
864 typedef Elf32_Half      Elf32_Versym;
865
866 #if __LIBELF64
867
868 typedef struct {
869     Elf64_Half          vd_version;
870     Elf64_Half          vd_flags;
871     Elf64_Half          vd_ndx;
872     Elf64_Half          vd_cnt;
873     Elf64_Word          vd_hash;
874     Elf64_Word          vd_aux;
875     Elf64_Word          vd_next;
876 } Elf64_Verdef;
877
878 typedef struct {
879     Elf64_Word          vda_name;
880     Elf64_Word          vda_next;
881 } Elf64_Verdaux;
882
883 typedef struct {
884     Elf64_Half          vn_version;
885     Elf64_Half          vn_cnt;
886     Elf64_Word          vn_file;
887     Elf64_Word          vn_aux;
888     Elf64_Word          vn_next;
889 } Elf64_Verneed;
890
891 typedef struct {
892     Elf64_Word          vna_hash;
893     Elf64_Half          vna_flags;
894     Elf64_Half          vna_other;
895     Elf64_Word          vna_name;
896     Elf64_Word          vna_next;
897 } Elf64_Vernaux;
898
899 typedef Elf64_Half      Elf64_Versym;
900
901 #endif /* __LIBELF64 */
902
903 /*
904  * vd_version
905  */
906 #define VER_DEF_NONE    0
907 #define VER_DEF_CURRENT 1
908 #define VER_DEF_NUM     2
909
910 /*
911  * vn_version
912  */
913 #define VER_NEED_NONE           0
914 #define VER_NEED_CURRENT        1
915 #define VER_NEED_NUM            2
916
917 /*
918  * vd_flags / vna_flags
919  */
920 #define VER_FLG_BASE    0x1     /* vd_flags only */
921 #define VER_FLG_WEAK    0x2
922
923 /*
924  * Elf*_Versym special values
925  */
926 #define VER_NDX_LOCAL   0
927 #define VER_NDX_GLOBAL  1
928
929 /*
930  * Solaris extensions
931  */
932
933 /*
934  * Move section
935  */
936 #if __LIBELF64
937
938 typedef struct {
939     Elf32_Lword         m_value;
940     Elf32_Word          m_info;
941     Elf32_Word          m_poffset;
942     Elf32_Half          m_repeat;
943     Elf32_Half          m_stride;
944 } Elf32_Move;
945
946 typedef struct {
947     Elf64_Lword         m_value;
948     Elf64_Xword         m_info;
949     Elf64_Xword         m_poffset;
950     Elf64_Half          m_repeat;
951     Elf64_Half          m_stride;
952 } Elf64_Move;
953
954 #define ELF32_M_SYM(info)       ((info)>>8)
955 #define ELF32_M_SIZE(info)      ((unsigned char)(info))
956 #define ELF32_M_INFO(sym, sz)   (((sym)<<8)+(unsigned char)(sz))
957
958 #define ELF64_M_SYM(info)       ((Elf64_Xword)(info)>>8)
959 #define ELF64_M_SIZE(info)      ((unsigned char)(info))
960 #define ELF64_M_INFO(sym, sz)   (((Elf64_Xword)(sym)<<8)+(unsigned char)(sz))
961
962 #endif /* __LIBELF64 */
963
964 /*
965  * Capabilities
966  */
967
968 typedef struct {
969     Elf32_Word          c_tag;
970     union {
971         Elf32_Word      c_val;
972         Elf32_Addr      c_ptr;
973     } c_un;
974 } Elf32_Cap;
975
976 #if __LIBELF64
977
978 typedef struct {
979     Elf64_Xword         c_tag;
980     union {
981         Elf64_Xword     c_val;
982         Elf64_Addr      c_ptr;
983     } c_un;
984 } Elf64_Cap;
985
986 #endif /* __LIBELF64 */
987
988 #define CA_SUNW_NULL    0       /* c_un ignored */
989 #define CA_SUNW_HW_1    1       /* c_un.c_val */
990 #define CA_SUNW_SF_1    2       /* c_un.c_val */
991
992 #ifdef __cplusplus
993 }
994 #endif /* __cplusplus */
995
996 #endif /* _ELF_REPL_H */