1/*
2 * sys/elfcommon.h
3 */
4
5#ifndef _SYS_ELFCOMMON_H
6#define _SYS_ELFCOMMON_H
7
8#include <stdint.h>
9
10/* Segment types */
11#define PT_NULL		0
12#define PT_LOAD		1
13#define PT_DYNAMIC	2
14#define PT_INTERP	3
15#define PT_NOTE		4
16#define PT_SHLIB	5
17#define PT_PHDR		6
18#define PT_LOOS		0x60000000
19#define PT_HIOS		0x6fffffff
20#define PT_LOPROC	0x70000000
21#define PT_HIPROC	0x7fffffff
22#define PT_GNU_EH_FRAME	0x6474e550	/* Extension, eh? */
23
24/* ELF file types */
25#define ET_NONE		0
26#define ET_REL		1
27#define ET_EXEC		2
28#define ET_DYN		3
29#define ET_CORE		4
30#define ET_LOPROC	0xff00
31#define ET_HIPROC	0xffff
32
33/* ELF machine types */
34#define EM_NONE		0
35#define EM_M32		1
36#define EM_SPARC	2
37#define EM_386		3
38#define EM_68K		4
39#define EM_88K		5
40#define EM_486		6	/* Not used in Linux at least */
41#define EM_860		7
42#define EM_MIPS         8	/* R3k, bigendian(?) */
43#define EM_MIPS_RS4_BE	10	/* R4k BE */
44#define EM_PARISC	15
45#define EM_SPARC32PLUS	18
46#define EM_PPC		20
47#define EM_PPC64	21
48#define EM_S390         22
49#define EM_SH		42
50#define EM_SPARCV9	43	/* v9 = SPARC64 */
51#define EM_H8_300H      47
52#define EM_H8S          48
53#define EM_IA_64        50	/* Itanic */
54#define EM_X86_64       62
55#define EM_CRIS         76
56#define EM_V850         87
57#define EM_ALPHA        0x9026	/* Interrim Alpha that stuck around */
58#define EM_CYGNUS_V850  0x9080	/* Old v850 ID used by Cygnus */
59#define EM_S390_OLD     0xA390	/* Obsolete interrim value for S/390 */
60
61/* Dynamic type values */
62#define DT_NULL		0		/* Marks end of dynamic section */
63#define DT_NEEDED	1		/* Name of needed library */
64#define DT_PLTRELSZ	2		/* Size in bytes of PLT relocs */
65#define DT_PLTGOT	3		/* Processor defined value */
66#define DT_HASH		4		/* Address of symbol hash table */
67#define DT_STRTAB	5		/* Address of string table */
68#define DT_SYMTAB	6		/* Address of symbol table */
69#define DT_RELA		7		/* Address of Rela relocs */
70#define DT_RELASZ	8		/* Total size of Rela relocs */
71#define DT_RELAENT	9		/* Size of one Rela reloc */
72#define DT_STRSZ	10		/* Size of string table */
73#define DT_SYMENT	11		/* Size of one symbol table entry */
74#define DT_INIT		12		/* Address of init function */
75#define DT_FINI		13		/* Address of termination function */
76#define DT_SONAME	14		/* Name of shared object */
77#define DT_RPATH	15		/* Library search path (deprecated) */
78#define DT_SYMBOLIC	16		/* Start symbol search here */
79#define DT_REL		17		/* Address of Rel relocs */
80#define DT_RELSZ	18		/* Total size of Rel relocs */
81#define DT_RELENT	19		/* Size of one Rel reloc */
82#define DT_PLTREL	20		/* Type of reloc in PLT */
83#define DT_DEBUG	21		/* For debugging; unspecified */
84#define DT_TEXTREL	22		/* Reloc might modify .text */
85#define DT_JMPREL	23		/* Address of PLT relocs */
86#define	DT_BIND_NOW	24		/* Process relocations of object */
87#define	DT_INIT_ARRAY	25		/* Array with addresses of init fct */
88#define	DT_FINI_ARRAY	26		/* Array with addresses of fini fct */
89#define	DT_INIT_ARRAYSZ	27		/* Size in bytes of DT_INIT_ARRAY */
90#define	DT_FINI_ARRAYSZ	28		/* Size in bytes of DT_FINI_ARRAY */
91#define DT_RUNPATH	29		/* Library search path */
92#define DT_FLAGS	30		/* Flags for the object being loaded */
93#define DT_ENCODING	32		/* Start of encoded range */
94#define DT_PREINIT_ARRAY 32		/* Array with addresses of preinit fct*/
95#define DT_PREINIT_ARRAYSZ 33		/* size in bytes of DT_PREINIT_ARRAY */
96#define	DT_NUM		34		/* Number used */
97#define DT_LOOS		0x6000000d	/* Start of OS-specific */
98#define DT_HIOS		0x6ffff000	/* End of OS-specific */
99#define DT_LOPROC	0x70000000	/* Start of processor-specific */
100#define DT_HIPROC	0x7fffffff	/* End of processor-specific */
101
102#define DT_VALRNGLO	0x6ffffd00
103#define DT_GNU_PRELINKED 0x6ffffdf5	/* Prelinking timestamp */
104#define DT_GNU_CONFLICTSZ 0x6ffffdf6	/* Size of conflict section */
105#define DT_GNU_LIBLISTSZ 0x6ffffdf7	/* Size of library list */
106#define DT_CHECKSUM	0x6ffffdf8
107#define DT_PLTPADSZ	0x6ffffdf9
108#define DT_MOVEENT	0x6ffffdfa
109#define DT_MOVESZ	0x6ffffdfb
110#define DT_FEATURE_1	0x6ffffdfc	/* Feature selection (DTF_*).  */
111#define DT_POSFLAG_1	0x6ffffdfd	/* Flags for DT_* entries, effecting
112					   the following DT_* entry.  */
113#define DT_SYMINSZ	0x6ffffdfe	/* Size of syminfo table (in bytes) */
114#define DT_SYMINENT	0x6ffffdff	/* Entry size of syminfo */
115#define DT_VALRNGHI	0x6ffffdff
116#define DT_VALTAGIDX(tag)	(DT_VALRNGHI - (tag))	/* Reverse order! */
117#define DT_VALNUM 12
118
119/* DT_* entries which fall between DT_ADDRRNGHI & DT_ADDRRNGLO use the
120   Dyn.d_un.d_ptr field of the Elf*_Dyn structure.
121
122   If any adjustment is made to the ELF object after it has been
123   built these entries will need to be adjusted.  */
124#define DT_ADDRRNGLO	0x6ffffe00
125#define DT_GNU_HASH	0x6ffffef5	/* GNU-style hash table.  */
126#define DT_TLSDESC_PLT	0x6ffffef6
127#define DT_TLSDESC_GOT	0x6ffffef7
128#define DT_GNU_CONFLICT	0x6ffffef8	/* Start of conflict section */
129#define DT_GNU_LIBLIST	0x6ffffef9	/* Library list */
130#define DT_CONFIG	0x6ffffefa	/* Configuration information.  */
131#define DT_DEPAUDIT	0x6ffffefb	/* Dependency auditing.  */
132#define DT_AUDIT	0x6ffffefc	/* Object auditing.  */
133#define	DT_PLTPAD	0x6ffffefd	/* PLT padding.  */
134#define	DT_MOVETAB	0x6ffffefe	/* Move table.  */
135#define DT_SYMINFO	0x6ffffeff	/* Syminfo table.  */
136#define DT_ADDRRNGHI	0x6ffffeff
137#define DT_ADDRTAGIDX(tag)	(DT_ADDRRNGHI - (tag))	/* Reverse order! */
138#define DT_ADDRNUM 11
139
140/* The versioning entry types.  The next are defined as part of the
141   GNU extension.  */
142#define DT_VERSYM	0x6ffffff0
143
144#define DT_RELACOUNT	0x6ffffff9
145#define DT_RELCOUNT	0x6ffffffa
146
147/* These were chosen by Sun.  */
148#define DT_FLAGS_1	0x6ffffffb	/* State flags, see DF_1_* below.  */
149#define	DT_VERDEF	0x6ffffffc	/* Address of version definition
150					   table */
151#define	DT_VERDEFNUM	0x6ffffffd	/* Number of version definitions */
152#define	DT_VERNEED	0x6ffffffe	/* Address of table with needed
153					   versions */
154#define	DT_VERNEEDNUM	0x6fffffff	/* Number of needed versions */
155#define DT_VERSIONTAGIDX(tag)	(DT_VERNEEDNUM - (tag))	/* Reverse order! */
156#define DT_VERSIONTAGNUM 16
157
158/* Sun added these machine-independent extensions in the "processor-specific"
159   range.  Be compatible.  */
160#define DT_AUXILIARY    0x7ffffffd      /* Shared object to load before self */
161#define DT_FILTER       0x7fffffff      /* Shared object to get values from */
162#define DT_EXTRATAGIDX(tag)	((Elf32_Word)-((Elf32_Sword) (tag) <<1>>1)-1)
163#define DT_EXTRANUM	3
164
165/* Auxilliary table entries */
166#define AT_NULL		0	/* end of vector */
167#define AT_IGNORE	1	/* entry should be ignored */
168#define AT_EXECFD	2	/* file descriptor of program */
169#define AT_PHDR		3	/* program headers for program */
170#define AT_PHENT	4	/* size of program header entry */
171#define AT_PHNUM	5	/* number of program headers */
172#define AT_PAGESZ	6	/* system page size */
173#define AT_BASE		7	/* base address of interpreter */
174#define AT_FLAGS	8	/* flags */
175#define AT_ENTRY	9	/* entry point of program */
176#define AT_NOTELF	10	/* program is not ELF */
177#define AT_UID		11	/* real uid */
178#define AT_EUID		12	/* effective uid */
179#define AT_GID		13	/* real gid */
180#define AT_EGID		14	/* effective gid */
181#define AT_PLATFORM	15	/* string identifying CPU for optimizations */
182#define AT_HWCAP	16	/* arch dependent hints at CPU capabilities */
183#define AT_CLKTCK	17	/* frequency at which times() increments */
184/* 18..22 = ? */
185#define AT_SECURE	23	/* secure mode boolean */
186
187/* Program header permission flags */
188#define PF_X            0x1
189#define PF_W            0x2
190#define PF_R            0x4
191
192/* Section header types */
193#define SHT_NULL        0
194#define SHT_PROGBITS    1
195#define SHT_SYMTAB      2
196#define SHT_STRTAB      3
197#define SHT_RELA        4
198#define SHT_HASH        5
199#define SHT_DYNAMIC     6
200#define SHT_NOTE        7
201#define SHT_NOBITS      8
202#define SHT_REL         9
203#define SHT_SHLIB       10
204#define SHT_DYNSYM      11
205#define SHT_NUM         12
206#define SHT_LOPROC      0x70000000
207#define SHT_HIPROC      0x7fffffff
208#define SHT_LOUSER      0x80000000
209#define SHT_HIUSER      0xffffffff
210
211/* Section header flags */
212#define SHF_WRITE       0x1
213#define SHF_ALLOC       0x2
214#define SHF_EXECINSTR   0x4
215#define SHF_MASKPROC    0xf0000000
216
217/* Special section numbers */
218#define SHN_UNDEF       0
219#define SHN_LORESERVE   0xff00
220#define SHN_LOPROC      0xff00
221#define SHN_HIPROC      0xff1f
222#define SHN_ABS         0xfff1
223#define SHN_COMMON      0xfff2
224#define SHN_HIRESERVE   0xffff
225
226/* Symbol table definitions */
227
228/* How to extract and insert information held in the st_info field.  */
229
230#define ELF32_ST_BIND(val)		(((unsigned char) (val)) >> 4)
231#define ELF32_ST_TYPE(val)		((val) & 0xf)
232#define ELF32_ST_INFO(bind, type)	(((bind) << 4) + ((type) & 0xf))
233
234/* Both Elf32_Sym and Elf64_Sym use the same one-byte st_info field.  */
235#define ELF64_ST_BIND(val)		ELF32_ST_BIND (val)
236#define ELF64_ST_TYPE(val)		ELF32_ST_TYPE (val)
237#define ELF64_ST_INFO(bind, type)	ELF32_ST_INFO ((bind), (type))
238
239/* Legal values for ST_BIND subfield of st_info (symbol binding).  */
240
241#define STB_LOCAL	0		/* Local symbol */
242#define STB_GLOBAL	1		/* Global symbol */
243#define STB_WEAK	2		/* Weak symbol */
244#define	STB_NUM		3		/* Number of defined types.  */
245#define STB_LOOS	10		/* Start of OS-specific */
246#define STB_HIOS	12		/* End of OS-specific */
247#define STB_LOPROC	13		/* Start of processor-specific */
248#define STB_HIPROC	15		/* End of processor-specific */
249
250/* Legal values for ST_TYPE subfield of st_info (symbol type).  */
251
252#define STT_NOTYPE	0		/* Symbol type is unspecified */
253#define STT_OBJECT	1		/* Symbol is a data object */
254#define STT_FUNC	2		/* Symbol is a code object */
255#define STT_SECTION	3		/* Symbol associated with a section */
256#define STT_FILE	4		/* Symbol's name is file name */
257#define STT_COMMON	5		/* Symbol is a common data object */
258#define STT_TLS		6		/* Symbol is thread-local data object*/
259#define	STT_NUM		7		/* Number of defined types.  */
260#define STT_LOOS	10		/* Start of OS-specific */
261#define STT_HIOS	12		/* End of OS-specific */
262#define STT_LOPROC	13		/* Start of processor-specific */
263#define STT_HIPROC	15		/* End of processor-specific */
264
265
266/* Symbol table indices are found in the hash buckets and chain table
267   of a symbol hash table section.  This special index value indicates
268   the end of a chain, meaning no further symbols are found in that bucket.  */
269
270#define STN_UNDEF	0		/* End of a chain.  */
271
272/* Lenght of magic at the start of a file */
273#define EI_NIDENT	16
274
275/* Magic number constants... */
276#define EI_MAG0         0	/* e_ident[] indexes */
277#define EI_MAG1         1
278#define EI_MAG2         2
279#define EI_MAG3         3
280#define EI_CLASS        4
281#define EI_DATA         5
282#define EI_VERSION      6
283#define EI_OSABI        7
284#define EI_PAD          8
285
286#define ELFMAG0         0x7f	/* EI_MAG */
287#define ELFMAG1         'E'
288#define ELFMAG2         'L'
289#define ELFMAG3         'F'
290#define ELFMAG          "\177ELF"
291#define SELFMAG         4
292
293#define ELFCLASSNONE    0	/* EI_CLASS */
294#define ELFCLASS32      1
295#define ELFCLASS64      2
296#define ELFCLASSNUM     3
297
298#define ELFDATANONE     0	/* e_ident[EI_DATA] */
299#define ELFDATA2LSB     1
300#define ELFDATA2MSB     2
301
302#define EV_NONE         0	/* e_version, EI_VERSION */
303#define EV_CURRENT      1
304#define EV_NUM          2
305
306#define ELFOSABI_NONE   0
307#define ELFOSABI_LINUX  3
308
309/* Intel 80386 specific definitions.  */
310
311/* i386 relocs.  */
312
313#define R_386_NONE	   0		/* No reloc */
314#define R_386_32	   1		/* Direct 32 bit  */
315#define R_386_PC32	   2		/* PC relative 32 bit */
316#define R_386_GOT32	   3		/* 32 bit GOT entry */
317#define R_386_PLT32	   4		/* 32 bit PLT address */
318#define R_386_COPY	   5		/* Copy symbol at runtime */
319#define R_386_GLOB_DAT	   6		/* Create GOT entry */
320#define R_386_JMP_SLOT	   7		/* Create PLT entry */
321#define R_386_RELATIVE	   8		/* Adjust by program base */
322#define R_386_GOTOFF	   9		/* 32 bit offset to GOT */
323#define R_386_GOTPC	   10		/* 32 bit PC relative offset to GOT */
324#define R_386_32PLT	   11
325#define R_386_TLS_TPOFF	   14		/* Offset in static TLS block */
326#define R_386_TLS_IE	   15		/* Address of GOT entry for static TLS
327					   block offset */
328#define R_386_TLS_GOTIE	   16		/* GOT entry for static TLS block
329					   offset */
330#define R_386_TLS_LE	   17		/* Offset relative to static TLS
331					   block */
332#define R_386_TLS_GD	   18		/* Direct 32 bit for GNU version of
333					   general dynamic thread local data */
334#define R_386_TLS_LDM	   19		/* Direct 32 bit for GNU version of
335					   local dynamic thread local data
336					   in LE code */
337#define R_386_16	   20
338#define R_386_PC16	   21
339#define R_386_8		   22
340#define R_386_PC8	   23
341#define R_386_TLS_GD_32	   24		/* Direct 32 bit for general dynamic
342					   thread local data */
343#define R_386_TLS_GD_PUSH  25		/* Tag for pushl in GD TLS code */
344#define R_386_TLS_GD_CALL  26		/* Relocation for call to
345					   __tls_get_addr() */
346#define R_386_TLS_GD_POP   27		/* Tag for popl in GD TLS code */
347#define R_386_TLS_LDM_32   28		/* Direct 32 bit for local dynamic
348					   thread local data in LE code */
349#define R_386_TLS_LDM_PUSH 29		/* Tag for pushl in LDM TLS code */
350#define R_386_TLS_LDM_CALL 30		/* Relocation for call to
351					   __tls_get_addr() in LDM code */
352#define R_386_TLS_LDM_POP  31		/* Tag for popl in LDM TLS code */
353#define R_386_TLS_LDO_32   32		/* Offset relative to TLS block */
354#define R_386_TLS_IE_32	   33		/* GOT entry for negated static TLS
355					   block offset */
356#define R_386_TLS_LE_32	   34		/* Negated offset relative to static
357					   TLS block */
358#define R_386_TLS_DTPMOD32 35		/* ID of module containing symbol */
359#define R_386_TLS_DTPOFF32 36		/* Offset in TLS block */
360#define R_386_TLS_TPOFF32  37		/* Negated offset in static TLS block */
361/* Keep this the last entry.  */
362#define R_386_NUM	   38
363
364/* AMD x86-64 relocations.  */
365#define R_X86_64_NONE		0	/* No reloc */
366#define R_X86_64_64		1	/* Direct 64 bit  */
367#define R_X86_64_PC32		2	/* PC relative 32 bit signed */
368#define R_X86_64_GOT32		3	/* 32 bit GOT entry */
369#define R_X86_64_PLT32		4	/* 32 bit PLT address */
370#define R_X86_64_COPY		5	/* Copy symbol at runtime */
371#define R_X86_64_GLOB_DAT	6	/* Create GOT entry */
372#define R_X86_64_JUMP_SLOT	7	/* Create PLT entry */
373#define R_X86_64_RELATIVE	8	/* Adjust by program base */
374#define R_X86_64_GOTPCREL	9	/* 32 bit signed PC relative
375					   offset to GOT */
376#define R_X86_64_32		10	/* Direct 32 bit zero extended */
377#define R_X86_64_32S		11	/* Direct 32 bit sign extended */
378#define R_X86_64_16		12	/* Direct 16 bit zero extended */
379#define R_X86_64_PC16		13	/* 16 bit sign extended pc relative */
380#define R_X86_64_8		14	/* Direct 8 bit sign extended  */
381#define R_X86_64_PC8		15	/* 8 bit sign extended pc relative */
382#define R_X86_64_DTPMOD64	16	/* ID of module containing symbol */
383#define R_X86_64_DTPOFF64	17	/* Offset in module's TLS block */
384#define R_X86_64_TPOFF64	18	/* Offset in initial TLS block */
385#define R_X86_64_TLSGD		19	/* 32 bit signed PC relative offset
386					   to two GOT entries for GD symbol */
387#define R_X86_64_TLSLD		20	/* 32 bit signed PC relative offset
388					   to two GOT entries for LD symbol */
389#define R_X86_64_DTPOFF32	21	/* Offset in TLS block */
390#define R_X86_64_GOTTPOFF	22	/* 32 bit signed PC relative offset
391					   to GOT entry for IE symbol */
392#define R_X86_64_TPOFF32	23	/* Offset in initial TLS block */
393#define R_X86_64_PC64		24	/* PC relative 64 bit */
394#define R_X86_64_GOTOFF64	25	/* 64 bit offset to GOT */
395#define R_X86_64_GOTPC32	26	/* 32 bit signed pc relative
396					   offset to GOT */
397#define R_X86_64_GOT64		27	/* 64-bit GOT entry offset */
398#define R_X86_64_GOTPCREL64	28	/* 64-bit PC relative offset
399					   to GOT entry */
400#define R_X86_64_GOTPC64	29	/* 64-bit PC relative offset to GOT */
401#define R_X86_64_GOTPLT64	30 	/* like GOT64, says PLT entry needed */
402#define R_X86_64_PLTOFF64	31	/* 64-bit GOT relative offset
403					   to PLT entry */
404#define R_X86_64_SIZE32		32	/* Size of symbol plus 32-bit addend */
405#define R_X86_64_SIZE64		33	/* Size of symbol plus 64-bit addend */
406#define R_X86_64_GOTPC32_TLSDESC 34	/* GOT offset for TLS descriptor.  */
407#define R_X86_64_TLSDESC_CALL   35	/* Marker for call through TLS
408					   descriptor.  */
409#define R_X86_64_TLSDESC        36	/* TLS descriptor.  */
410#define R_X86_64_IRELATIVE	37	/* Adjust indirectly by program base */
411
412#define R_X86_64_NUM		38
413
414#endif				/* _SYS_ELFCOMMON_H */
415