UbixOS  2.0
elf.h
Go to the documentation of this file.
1 /*-
2  * Copyright (c) 2002-2018 The UbixOS Project.
3  * All rights reserved.
4  *
5  * This was developed by Christopher W. Olsen for the UbixOS Project.
6  *
7  * Redistribution and use in source and binary forms, with or without modification, are permitted
8  * provided that the following conditions are met:
9  *
10  * 1) Redistributions of source code must retain the above copyright notice, this list of
11  * conditions, the following disclaimer and the list of authors.
12  * 2) Redistributions in binary form must reproduce the above copyright notice, this list of
13  * conditions, the following disclaimer and the list of authors in the documentation and/or
14  * other materials provided with the distribution.
15  * 3) Neither the name of the UbixOS Project nor the names of its contributors may be used to
16  * endorse or promote products derived from this software without specific prior written
17  * permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
20  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
21  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
22  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
24  * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
26  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28 
29 #ifndef _I386_ELF_H_
30 #define _I386_ELF_H_ 1
31 
32 #if defined(__i386__) || defined(_MACHINE_ELF_WANT_32BIT)
33 
34 /*
35  * ELF definitions for the i386 architecture.
36  */
37 
38 #include <sys/elf32.h> /* Definitions common to all 32 bit architectures. */
39 #if defined(__ELF_WORD_SIZE) && __ELF_WORD_SIZE == 64
40 #include <sys/elf64.h> /* Definitions common to all 64 bit architectures. */
41 #endif
42 
43 #ifndef __ELF_WORD_SIZE
44 #define __ELF_WORD_SIZE 32 /* Used by <sys/elf_generic.h> */
45 #endif
46 
47 #include <sys/elf_generic.h>
48 
49 #define ELF_ARCH EM_386
50 
51 #define ELF_MACHINE_OK(x) ((x) == EM_386 || (x) == EM_486)
52 
53 /*
54  * Auxiliary vector entries for passing information to the interpreter.
55  *
56  * The i386 supplement to the SVR4 ABI specification names this "auxv_t",
57  * but POSIX lays claim to all symbols ending with "_t".
58  */
59 
60 typedef struct { /* Auxiliary vector entry on initial stack */
61  int a_type; /* Entry type. */
62  union {
63  long a_val; /* Integer value. */
64  void *a_ptr; /* Address. */
65  void (*a_fcn)(void); /* Function pointer (not used). */
66  }a_un;
67 }Elf32_Auxinfo;
68 
69 #if __ELF_WORD_SIZE == 64
70 /* Fake for amd64 loader support */
71 typedef struct {
72  int fake;
73 }Elf64_Auxinfo;
74 #endif
75 
76 __ElfType(Auxinfo);
77 
78 /* Values for a_type. */
79 #define AT_NULL 0 /* Terminates the vector. */
80 #define AT_IGNORE 1 /* Ignored entry. */
81 #define AT_EXECFD 2 /* File descriptor of program to load. */
82 #define AT_PHDR 3 /* Program header of program already loaded. */
83 #define AT_PHENT 4 /* Size of each program header entry. */
84 #define AT_PHNUM 5 /* Number of program header entries. */
85 #define AT_PAGESZ 6 /* Page size in bytes. */
86 #define AT_BASE 7 /* Interpreter's base address. */
87 #define AT_FLAGS 8 /* Flags (unused for i386). */
88 #define AT_ENTRY 9 /* Where interpreter should transfer control. */
89 #define AT_NOTELF 10 /* Program is not ELF ?? */
90 #define AT_UID 11 /* Real uid. */
91 #define AT_EUID 12 /* Effective uid. */
92 #define AT_GID 13 /* Real gid. */
93 #define AT_EGID 14 /* Effective gid. */
94 #define AT_EXECPATH 15 /* Path to the executable. */
95 #define AT_CANARY 16 /* Canary for SSP. */
96 #define AT_CANARYLEN 17 /* Length of the canary. */
97 #define AT_OSRELDATE 18 /* OSRELDATE. */
98 #define AT_NCPUS 19 /* Number of CPUs. */
99 #define AT_PAGESIZES 20 /* Pagesizes. */
100 #define AT_PAGESIZESLEN 21 /* Number of pagesizes. */
101 #define AT_TIMEKEEP 22 /* Pointer to timehands. */
102 #define AT_STACKPROT 23 /* Initial stack protection. */
103 
104 #define AT_COUNT 24 /* Count of defined aux entry types. */
105 
106 /*
107  * Relocation types.
108  */
109 
110 #define R_386_COUNT 38 /* Count of defined relocation types. */
111 
112 /* Define "machine" characteristics */
113 #define ELF_TARG_CLASS ELFCLASS32
114 #define ELF_TARG_DATA ELFDATA2LSB
115 #define ELF_TARG_MACH EM_386
116 #define ELF_TARG_VER 1
117 
118 #define ET_DYN_LOAD_ADDR 0x01001000
119 
120 #elif defined(__amd64__)
121 
122 /*
123  * ELF definitions for the AMD64 architecture.
124  */
125 
126 #ifndef __ELF_WORD_SIZE
127 #define __ELF_WORD_SIZE 64 /* Used by <sys/elf_generic.h> */
128 #endif
129 #include <sys/elf32.h> /* Definitions common to all 32 bit architectures. */
130 #include <sys/elf64.h> /* Definitions common to all 64 bit architectures. */
131 #include <sys/elf_generic.h>
132 
133 #define ELF_ARCH EM_X86_64
134 #define ELF_ARCH32 EM_386
135 
136 #define ELF_MACHINE_OK(x) ((x) == EM_X86_64)
137 
138 /*
139  * Auxiliary vector entries for passing information to the interpreter.
140  *
141  * The i386 supplement to the SVR4 ABI specification names this "auxv_t",
142  * but POSIX lays claim to all symbols ending with "_t".
143  */
144 typedef struct { /* Auxiliary vector entry on initial stack */
145  int a_type; /* Entry type. */
146  union {
147  int a_val; /* Integer value. */
148  }a_un;
149 }Elf32_Auxinfo;
150 
151 typedef struct { /* Auxiliary vector entry on initial stack */
152  long a_type; /* Entry type. */
153  union {
154  long a_val; /* Integer value. */
155  void *a_ptr; /* Address. */
156  void (*a_fcn)(void); /* Function pointer (not used). */
157  }a_un;
158 }Elf64_Auxinfo;
159 
160 __ElfType(Auxinfo);
161 
162 /* Values for a_type. */
163 #define AT_NULL 0 /* Terminates the vector. */
164 #define AT_IGNORE 1 /* Ignored entry. */
165 #define AT_EXECFD 2 /* File descriptor of program to load. */
166 #define AT_PHDR 3 /* Program header of program already loaded. */
167 #define AT_PHENT 4 /* Size of each program header entry. */
168 #define AT_PHNUM 5 /* Number of program header entries. */
169 #define AT_PAGESZ 6 /* Page size in bytes. */
170 #define AT_BASE 7 /* Interpreter's base address. */
171 #define AT_FLAGS 8 /* Flags (unused for i386). */
172 #define AT_ENTRY 9 /* Where interpreter should transfer control. */
173 #define AT_NOTELF 10 /* Program is not ELF ?? */
174 #define AT_UID 11 /* Real uid. */
175 #define AT_EUID 12 /* Effective uid. */
176 #define AT_GID 13 /* Real gid. */
177 #define AT_EGID 14 /* Effective gid. */
178 #define AT_EXECPATH 15 /* Path to the executable. */
179 #define AT_CANARY 16 /* Canary for SSP */
180 #define AT_CANARYLEN 17 /* Length of the canary. */
181 #define AT_OSRELDATE 18 /* OSRELDATE. */
182 #define AT_NCPUS 19 /* Number of CPUs. */
183 #define AT_PAGESIZES 20 /* Pagesizes. */
184 #define AT_PAGESIZESLEN 21 /* Number of pagesizes. */
185 #define AT_TIMEKEEP 22 /* Pointer to timehands. */
186 #define AT_STACKPROT 23 /* Initial stack protection. */
187 
188 #define AT_COUNT 24 /* Count of defined aux entry types. */
189 
190 /*
191  * Relocation types.
192  */
193 
194 #define R_X86_64_COUNT 24 /* Count of defined relocation types. */
195 
196 /* Define "machine" characteristics */
197 #if __ELF_WORD_SIZE == 32
198 #define ELF_TARG_CLASS ELFCLASS32
199 #else
200 #define ELF_TARG_CLASS ELFCLASS64
201 #endif
202 #define ELF_TARG_DATA ELFDATA2LSB
203 #define ELF_TARG_MACH EM_X86_64
204 #define ELF_TARG_VER 1
205 
206 #if __ELF_WORD_SIZE == 32
207 #define ET_DYN_LOAD_ADDR 0x01001000
208 #else
209 #define ET_DYN_LOAD_ADDR 0x01021000
210 #endif
211 
212 #endif /* __i386__, __amd64__ */
213 
214 #endif
elf32.h
elf_generic.h
elf64.h
__ElfType
#define __ElfType(x)
Definition: elf_generic.h:56