xref: /freebsd/sys/x86/include/elf.h (revision 4db78cacdee1b6f3b7880eb8c5560e8edaf91698)
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3  *
4  * Copyright (c) 1996-1997 John D. Polstra.
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26  * SUCH DAMAGE.
27  *
28  * $FreeBSD$
29  */
30 
31 #ifndef _MACHINE_ELF_H_
32 #define	_MACHINE_ELF_H_ 1
33 
34 #if defined(__i386__) || defined(_MACHINE_ELF_WANT_32BIT)
35 
36 /*
37  * ELF definitions for the i386 architecture.
38  */
39 
40 #include <sys/elf32.h>	/* Definitions common to all 32 bit architectures. */
41 #if defined(__ELF_WORD_SIZE) && __ELF_WORD_SIZE == 64
42 #include <sys/elf64.h>	/* Definitions common to all 64 bit architectures. */
43 #endif
44 
45 #ifndef __ELF_WORD_SIZE
46 #define	__ELF_WORD_SIZE	32	/* Used by <sys/elf_generic.h> */
47 #endif
48 
49 #include <sys/elf_generic.h>
50 
51 #define	ELF_ARCH	EM_386
52 
53 #define	ELF_MACHINE_OK(x) ((x) == EM_386 || (x) == EM_486)
54 
55 /*
56  * Auxiliary vector entries for passing information to the interpreter.
57  *
58  * The i386 supplement to the SVR4 ABI specification names this "auxv_t",
59  * but POSIX lays claim to all symbols ending with "_t".
60  */
61 
62 typedef struct {	/* Auxiliary vector entry on initial stack */
63 	int	a_type;			/* Entry type. */
64 	union {
65 		long	a_val;		/* Integer value. */
66 		void	*a_ptr;		/* Address. */
67 		void	(*a_fcn)(void);	/* Function pointer (not used). */
68 	} a_un;
69 } Elf32_Auxinfo;
70 
71 #if __ELF_WORD_SIZE == 64
72 /* Fake for amd64 loader support */
73 typedef struct {
74 	int fake;
75 } Elf64_Auxinfo;
76 #endif
77 
78 __ElfType(Auxinfo);
79 
80 /*
81  * Relocation types.
82  */
83 
84 #define	R_386_COUNT	38	/* Count of defined relocation types. */
85 
86 /* Define "machine" characteristics */
87 #define	ELF_TARG_CLASS	ELFCLASS32
88 #define	ELF_TARG_DATA	ELFDATA2LSB
89 #define	ELF_TARG_MACH	EM_386
90 #define	ELF_TARG_VER	1
91 
92 #define	ET_DYN_LOAD_ADDR 0x01001000
93 
94 #elif defined(__amd64__)
95 
96 /*
97  * ELF definitions for the AMD64 architecture.
98  */
99 
100 #ifndef __ELF_WORD_SIZE
101 #define	__ELF_WORD_SIZE	64	/* Used by <sys/elf_generic.h> */
102 #endif
103 #include <sys/elf32.h>	/* Definitions common to all 32 bit architectures. */
104 #include <sys/elf64.h>	/* Definitions common to all 64 bit architectures. */
105 #include <sys/elf_generic.h>
106 
107 #define	ELF_ARCH	EM_X86_64
108 #define	ELF_ARCH32	EM_386
109 
110 #define	ELF_MACHINE_OK(x) ((x) == EM_X86_64)
111 
112 /*
113  * Auxiliary vector entries for passing information to the interpreter.
114  *
115  * The i386 supplement to the SVR4 ABI specification names this "auxv_t",
116  * but POSIX lays claim to all symbols ending with "_t".
117  */
118 typedef struct {	/* Auxiliary vector entry on initial stack */
119 	int	a_type;			/* Entry type. */
120 	union {
121 		int	a_val;		/* Integer value. */
122 	} a_un;
123 } Elf32_Auxinfo;
124 
125 
126 typedef struct {	/* Auxiliary vector entry on initial stack */
127 	long	a_type;			/* Entry type. */
128 	union {
129 		long	a_val;		/* Integer value. */
130 		void	*a_ptr;		/* Address. */
131 		void	(*a_fcn)(void);	/* Function pointer (not used). */
132 	} a_un;
133 } Elf64_Auxinfo;
134 
135 __ElfType(Auxinfo);
136 
137 /*
138  * Relocation types.
139  */
140 
141 #define	R_X86_64_COUNT	24	/* Count of defined relocation types. */
142 
143 /* Define "machine" characteristics */
144 #if __ELF_WORD_SIZE == 32
145 #define ELF_TARG_CLASS  ELFCLASS32
146 #else
147 #define ELF_TARG_CLASS  ELFCLASS64
148 #endif
149 #define	ELF_TARG_DATA	ELFDATA2LSB
150 #define	ELF_TARG_MACH	EM_X86_64
151 #define	ELF_TARG_VER	1
152 
153 #if __ELF_WORD_SIZE == 32
154 #define	ET_DYN_LOAD_ADDR 0x01001000
155 #else
156 #define	ET_DYN_LOAD_ADDR 0x01021000
157 #endif
158 
159 #endif /* __i386__, __amd64__ */
160 
161 #endif /* !_MACHINE_ELF_H_ */
162