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 */
997