1/*
2 * Copyright 2001, Travis Geiselbrecht. All rights reserved.
3 * Distributed under the terms of the NewOS License.
4 *
5 * Copyright 2002-2011, Haiku Inc. All Rights Reserved.
6 * Distributed under the terms of the MIT license.
7 */
8#ifndef _ELF_COMMON_H
9#define _ELF_COMMON_H
10
11
12#include <SupportDefs.h>
13#include <ByteOrder.h>
14
15#include <arch_elf.h>
16
17
18/*** ELF header ***/
19
20#define EI_NIDENT	16
21
22#define ELF_MAGIC	"\x7f""ELF"
23
24// e_ident[] indices
25#define EI_MAG0			0
26#define EI_MAG1			1
27#define EI_MAG2			2
28#define EI_MAG3			3
29#define EI_CLASS		4
30#define EI_DATA			5
31#define EI_VERSION		6
32#define EI_OSABI		7
33#define EI_ABIVERSION	8
34#define EI_PAD			9
35
36// e_machine (Architecture)
37#define EM_NONE			0 // No machine
38#define EM_M32			1 // AT&T WE 32100
39#define EM_SPARC		2 // Sparc
40#define EM_386			3 // Intel 80386
41#define EM_68K			4 // Motorola m68k family
42#define EM_88K			5 // Motorola m88k family
43#define EM_486			6 // Intel 80486, Reserved for future use
44#define EM_860			7 // Intel 80860
45#define EM_MIPS			8 // MIPS R3000 (officially, big-endian only)
46#define EM_S370			9 // IBM System/370
47#define EM_MIPS_RS3_LE	10 // MIPS R3000 little-endian, Deprecated
48#define EM_PARISC		15 // HPPA
49#define EM_VPP550		17 // Fujitsu VPP500
50#define EM_SPARC32PLUS	18 // Sun "v8plus"
51#define EM_960			19 // Intel 80960
52#define EM_PPC			20 // PowerPC
53#define EM_PPC64		21 // 64-bit PowerPC
54#define EM_S390			22 // IBM S/390
55#define EM_V800			36 // NEC V800 series
56#define EM_FR20			37 // Fujitsu FR20
57#define EM_RH32			38 // TRW RH32
58#define EM_MCORE		39 // Motorola M*Core
59#define EM_RCE			39 // Old name for MCore
60#define EM_ARM			40 // ARM
61#define EM_OLD_ALPHA	41 // Digital Alpha
62#define EM_SH			42 // Renesas / SuperH SH
63#define EM_SPARCV9		43 // SPARC v9 64-bit
64#define EM_TRICORE		44 // Siemens Tricore embedded processor
65#define EM_ARC			45 // ARC Cores
66#define EM_H8_300		46 // Renesas H8/300
67#define EM_H8_300H		47 // Renesas H8/300H
68#define EM_H8S			48 // Renesas H8S
69#define EM_H8_500		49 // Renesas H8/500
70#define EM_IA_64		50 // Intel IA-64 Processor
71#define EM_MIPS_X		51 // Stanford MIPS-X
72#define EM_COLDFIRE		52 // Motorola Coldfire
73#define EM_68HC12		53 // Motorola M68HC12
74#define EM_MMA			54 // Fujitsu Multimedia Accelerator
75#define EM_PCP			55 // Siemens PCP
76#define EM_NCPU			56 // Sony nCPU embedded RISC processor
77#define EM_NDR1			57 // Denso NDR1 microprocesspr
78#define EM_STARCORE		58 // Motorola Star*Core processor
79#define EM_ME16			59 // Toyota ME16 processor
80#define EM_ST100		60 // STMicroelectronics ST100 processor
81#define EM_TINYJ		61 // Advanced Logic Corp. TinyJ embedded processor
82#define EM_X86_64		62 // Advanced Micro Devices X86-64 processor
83
84// elf version (EI_VERSION)
85#define EV_NONE			0
86#define EV_CURRENT		1
87
88// architecture class (EI_CLASS)
89#define ELFCLASSNONE	0
90#define ELFCLASS32		1
91#define ELFCLASS64		2
92
93// endian (EI_DATA)
94#define ELFDATANONE	0	/* unknown data format */
95#define ELFDATA2LSB	1	/* little endian */
96#define ELFDATA2MSB	2	/* big endian */
97
98// abis (EI_OSABI)
99#define ELFOSABI_NONE		0	// UNIX System V ABI
100#define ELFOSABI_HPUX		1	// HP-UX operating system
101#define ELFOSABI_NETBSD		2	// NetBSD
102#define ELFOSABI_LINUX		3	// GNU/Linux
103#define ELFOSABI_HURD		4	// GNU/Hurd
104#define ELFOSABI_86OPEN		5	// 86Open common IA32 ABI
105#define ELFOSABI_SOLARIS	6	// Solaris
106#define ELFOSABI_AIX		7	// AIX
107#define ELFOSABI_IRIX		8	// IRIX
108#define ELFOSABI_FREEBSD	9	// FreeBSD
109#define ELFOSABI_TRU64		10	// TRU64 UNIX
110#define ELFOSABI_MODESTO	11	// Novell Modesto
111#define ELFOSABI_OPENBSD	12	// OpenBSD
112#define ELFOSABI_OPENVMS	13	// Open VMS
113#define ELFOSABI_NSK		14	// HP Non-Stop Kernel
114#define ELFOSABI_AROS		15	// Amiga Research OS
115#define ELFOSABI_ARM		97	// ARM
116#define ELFOSABI_STANDALONE	255	// Standalone (embedded) application
117
118#define ELFOSABI_SYSV		ELFOSABI_NONE	// symbol used in 1998 ELF spec
119#define ELFOSABI_HAIKU		ELFOSABI_NONE	// FATELF_TODO: Evaluate new OSABI
120
121/*** section header ***/
122
123// special section indices
124#define SHN_UNDEF		0
125#define SHN_LORESERVE	0xff00
126#define SHN_LOPROC		0xff00
127#define SHN_HIPROC		0xff1f
128#define SHN_ABS			0xfff1
129#define SHN_COMMON		0xfff2
130#define SHN_HIRESERVE	0xffff
131
132// section header type
133#define SHT_NULL		0
134#define SHT_PROGBITS	1
135#define SHT_SYMTAB		2
136#define SHT_STRTAB		3
137#define SHT_RELA		4
138#define SHT_HASH		5
139#define SHT_DYNAMIC		6
140#define SHT_NOTE		7
141#define SHT_NOBITS		8
142#define SHT_REL			9
143#define SHT_SHLIB		10
144#define SHT_DYNSYM		11
145
146#define SHT_GNU_verdef	0x6ffffffd    /* version definition section */
147#define SHT_GNU_verneed	0x6ffffffe    /* version needs section */
148#define SHT_GNU_versym	0x6fffffff    /* version symbol table */
149
150#define SHT_LOPROC		0x70000000
151#define SHT_HIPROC		0x7fffffff
152#define SHT_LOUSER		0x80000000
153#define SHT_HIUSER		0xffffffff
154
155// section header flags
156#define SHF_WRITE		1
157#define SHF_ALLOC		2
158#define SHF_EXECINSTR	4
159
160#define SHF_MASKPROC	0xf0000000
161
162
163/*** program header ***/
164
165// program header segment types
166#define PT_NULL		0
167#define PT_LOAD		1
168#define PT_DYNAMIC	2
169#define PT_INTERP	3
170#define PT_NOTE		4
171#define PT_SHLIB	5
172#define PT_PHDR		6
173#define PT_STACK	0x6474e551
174
175#define PT_LOPROC	0x70000000
176#define PT_HIPROC	0x7fffffff
177
178// program header segment flags
179#define PF_EXECUTE	0x1
180#define PF_WRITE	0x2
181#define PF_READ		0x4
182#define PF_PROTECTION_MASK (PF_EXECUTE | PF_WRITE | PF_READ)
183
184#define PF_MASKPROC	0xf0000000
185
186#define STT_NOTYPE 0
187#define STT_OBJECT 1
188#define STT_FUNC 2
189#define STT_SECTION 3
190#define STT_FILE 4
191#define STT_LOPROC 13
192#define STT_HIPROC 15
193
194#define STB_LOCAL 0
195#define STB_GLOBAL 1
196#define STB_WEAK 2
197#define STB_LOPROC 13
198#define STB_HIPROC 15
199
200#define STN_UNDEF 0
201
202
203#define DT_NULL				0
204#define DT_NEEDED			1
205#define DT_PLTRELSZ			2
206#define DT_PLTGOT			3
207#define DT_HASH				4
208#define DT_STRTAB			5
209#define DT_SYMTAB			6
210#define DT_RELA				7
211#define DT_RELASZ			8
212#define DT_RELAENT			9
213#define DT_STRSZ			10
214#define DT_SYMENT			11
215#define DT_INIT				12
216#define DT_FINI				13
217#define DT_SONAME			14
218#define DT_RPATH			15
219#define DT_SYMBOLIC			16
220#define DT_REL				17
221#define DT_RELSZ			18
222#define DT_RELENT			19
223#define DT_PLTREL			20
224#define DT_DEBUG			21
225#define DT_TEXTREL			22
226#define DT_JMPREL			23
227#define DT_BIND_NOW			24	/* no lazy binding */
228#define DT_INIT_ARRAY		25	/* init function array */
229#define DT_FINI_ARRAY		26	/* termination function array */
230#define DT_INIT_ARRAYSZ		27	/* init function array size */
231#define DT_FINI_ARRAYSZ		28	/* termination function array size */
232#define DT_RUNPATH			29	/* library search path (supersedes DT_RPATH) */
233#define DT_FLAGS			30	/* flags (see below) */
234#define DT_ENCODING			32
235#define DT_PREINIT_ARRAY	32	/* preinitialization array */
236#define DT_PREINIT_ARRAYSZ	33	/* preinitialization array size */
237
238#define DT_VERSYM       0x6ffffff0	/* symbol version table */
239#define DT_VERDEF		0x6ffffffc	/* version definition table */
240#define DT_VERDEFNUM	0x6ffffffd	/* number of version definitions */
241#define DT_VERNEED		0x6ffffffe 	/* table with needed versions */
242#define DT_VERNEEDNUM	0x6fffffff	/* number of needed versions */
243
244#define DT_LOPROC		0x70000000
245#define DT_HIPROC		0x7fffffff
246
247
248/* DT_FLAGS values */
249#define DF_ORIGIN		0x01
250#define DF_SYMBOLIC		0x02
251#define DF_TEXTREL		0x04
252#define DF_BIND_NOW		0x08
253#define DF_STATIC_TLS	0x10
254
255
256/* version definition section */
257
258/* values for vd_version (version revision) */
259#define VER_DEF_NONE		0		/* no version */
260#define VER_DEF_CURRENT		1		/* current version */
261#define VER_DEF_NUM			2		/* given version number */
262
263/* values for vd_flags (version information flags) */
264#define VER_FLG_BASE		0x1		/* version definition of file itself */
265#define VER_FLG_WEAK		0x2 	/* weak version identifier */
266
267/* values for versym symbol index */
268#define VER_NDX_LOCAL		0		/* symbol is local */
269#define VER_NDX_GLOBAL		1		/* symbol is global/unversioned */
270#define VER_NDX_INITIAL		2		/* initial version -- that's the one given
271									   to symbols when a library becomes
272									   versioned; handled by the linker (and
273									   runtime loader) similar to
274									   VER_NDX_GLOBAL */
275#define VER_NDX_LORESERVE	0xff00	/* beginning of reserved entries */
276#define VER_NDX_ELIMINATE	0xff01	/* symbol is to be eliminated */
277
278#define VER_NDX_FLAG_HIDDEN	0x8000	/* flag: version is hidden */
279#define VER_NDX_MASK		0x7fff	/* mask to get the actual version index */
280#define VER_NDX(x)			((x) & VER_NDX_MASK)
281
282
283/* version dependency section */
284
285/* values for vn_version (version revision) */
286#define VER_NEED_NONE		0	/* no version */
287#define VER_NEED_CURRENT	1	/* current version */
288#define VER_NEED_NUM		2	/* given version number */
289
290
291/* auxiliary needed version information */
292
293/* values for vna_flags */
294#define VER_FLG_WEAK	0x2		/* weak version identifier */
295
296
297// Determine the correct ELF types to use for the architecture
298
299#if B_HAIKU_64_BIT
300#	define _ELF_TYPE(type)	Elf64_##type
301#else
302#	define _ELF_TYPE(type)	Elf32_##type
303#endif
304#define DEFINE_ELF_TYPE(type, name) \
305	struct _ELF_TYPE(type); \
306	typedef struct _ELF_TYPE(type) name
307
308DEFINE_ELF_TYPE(Ehdr, elf_ehdr);
309DEFINE_ELF_TYPE(Phdr, elf_phdr);
310DEFINE_ELF_TYPE(Shdr, elf_shdr);
311DEFINE_ELF_TYPE(Sym, elf_sym);
312DEFINE_ELF_TYPE(Dyn, elf_dyn);
313DEFINE_ELF_TYPE(Rel, elf_rel);
314DEFINE_ELF_TYPE(Rela, elf_rela);
315DEFINE_ELF_TYPE(Verdef, elf_verdef);
316DEFINE_ELF_TYPE(Verdaux, elf_verdaux);
317DEFINE_ELF_TYPE(Verneed, elf_verneed);
318DEFINE_ELF_TYPE(Vernaux, elf_vernaux);
319
320#undef DEFINE_ELF_TYPE
321#undef _ELF_TYPE
322
323typedef uint16 elf_versym;
324
325#if B_HAIKU_64_BIT
326#	define ELF_CLASS	ELFCLASS64
327#else
328#	define ELF_CLASS	ELFCLASS32
329#endif
330
331#if B_HOST_IS_LENDIAN
332#	define ELF_DATA		ELFDATA2LSB
333#else
334#	define ELF_DATA		ELFDATA2MSB
335#endif
336
337// Generic image architecture description
338struct elf_image_arch {
339	uint16_t machine;		/* maps to e_machine. */
340	uint8_t osabi;			/* maps to e_ident[EI_OSABI]. */
341	uint8_t osabi_version;	/* maps to e_ident[EI_ABIVERSION]. */
342	uint8_t word_size;		/* maps to e_ident[EI_CLASS]. */
343	uint8_t byte_order;		/* maps to e_ident[EI_DATA]. */
344};
345
346#endif	/* _ELF_COMMON_H_ */
347