|
|
1.1 root 1: /*
2: * Copyright (c) 1995, 1994, 1993, 1992, 1991, 1990
3: * Open Software Foundation, Inc.
4: *
5: * Permission to use, copy, modify, and distribute this software and
6: * its documentation for any purpose and without fee is hereby granted,
7: * provided that the above copyright notice appears in all copies and
8: * that both the copyright notice and this permission notice appear in
9: * supporting documentation, and that the name of ("OSF") or Open Software
10: * Foundation not be used in advertising or publicity pertaining to
11: * distribution of the software without specific, written prior permission.
12: *
13: * OSF DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE
14: * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
15: * FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL OSF BE LIABLE FOR ANY
16: * SPECIAL, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
17: * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
18: * ACTION OF CONTRACT, NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING
19: * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE
20: *
21: */
22: /*
23: * OSF Research Institute MK6.1 (unencumbered) 1/31/1995
24: */
25: #ifndef _MACH_EXEC_ELF_H_
26: #define _MACH_EXEC_ELF_H_
27:
28: #include <mach/machine/exec/elf.h>
29:
30: /* ELF Header - figure 4-3, page 4-4 */
31:
32: #define EI_NIDENT 16
33:
34: typedef struct {
35: unsigned char e_ident[EI_NIDENT];
36: Elf32_Half e_type;
37: Elf32_Half e_machine;
38: Elf32_Word e_version;
39: Elf32_Addr e_entry;
40: Elf32_Off e_phoff;
41: Elf32_Off e_shoff;
42: Elf32_Word e_flags;
43: Elf32_Half e_ehsize;
44: Elf32_Half e_phentsize;
45: Elf32_Half e_phnum;
46: Elf32_Half e_shentsize;
47: Elf32_Half e_shnum;
48: Elf32_Half e_shstrndx;
49: } Elf32_Ehdr;
50:
51:
52: /* e_ident[] identification indexes - figure 4-4, page 4-7 */
53:
54: #define EI_MAG0 0
55: #define EI_MAG1 1
56: #define EI_MAG2 2
57: #define EI_MAG3 3
58: #define EI_CLASS 4
59: #define EI_DATA 5
60: #define EI_VERSION 6
61: #define EI_PAD 7
62:
63: /* magic number - pg 4-8 */
64:
65: #define ELFMAG0 0x7f
66: #define ELFMAG1 'E'
67: #define ELFMAG2 'L'
68: #define ELFMAG3 'F'
69:
70: /* file class or capacity - page 4-8 */
71:
72: #define ELFCLASSNONE 0
73: #define ELFCLASS32 1
74: #define ELFCLASS64 2
75:
76: /* date encoding - page 4-9 */
77:
78: #define ELFDATANONE 0
79: #define ELFDATA2LSB 1
80: #define ELFDATA2MSB 2
81:
82: /* object file types - page 4-5 */
83:
84: #define ET_NONE 0
85: #define ET_REL 1
86: #define ET_EXEC 2
87: #define ET_DYN 3
88: #define ET_CORE 4
89:
90: #define ET_LOPROC 0xff00
91: #define ET_HIPROC 0xffff
92:
93: /* architecture - page 4-5 */
94:
95: #define EM_NONE 0
96: #define EM_M32 1
97: #define EM_SPARC 2
98: #define EM_386 3
99: #define EM_68K 4
100: #define EM_88K 5
101: #define EM_860 7
102: #define EM_MIPS 8
103: #define EM_MIPS_RS4_BE 10
104: #define EM_SPARC64 11
105: #define EM_PARISC 15
106: #define EM_PPC 20
107:
108: /* version - page 4-6 */
109:
110: #define EV_NONE 0
111: #define EV_CURRENT 1
112:
113: /* special section indexes - page 4-11, figure 4-7 */
114:
115: #define SHN_UNDEF 0
116: #define SHN_LORESERVE 0xff00
117: #define SHN_LOPROC 0xff00
118: #define SHN_HIPROC 0xff1f
119: #define SHN_ABS 0xfff1
120: #define SHN_COMMON 0xfff2
121: #define SHN_HIRESERVE 0xffff
122:
123: /* section header - page 4-13, figure 4-8 */
124:
125: typedef struct {
126: Elf32_Word sh_name;
127: Elf32_Word sh_type;
128: Elf32_Word sh_flags;
129: Elf32_Addr sh_addr;
130: Elf32_Off sh_offset;
131: Elf32_Word sh_size;
132: Elf32_Word sh_link;
133: Elf32_Word sh_info;
134: Elf32_Word sh_addralign;
135: Elf32_Word sh_entsize;
136: } Elf32_Shdr;
137:
138: /* section types - page 4-15, figure 4-9 */
139:
140: #define SHT_NULL 0
141: #define SHT_PROGBITS 1
142: #define SHT_SYMTAB 2
143: #define SHT_STRTAB 3
144: #define SHT_RELA 4
145: #define SHT_HASH 5
146: #define SHT_DYNAMIC 6
147: #define SHT_NOTE 7
148: #define SHT_NOBITS 8
149: #define SHT_REL 9
150: #define SHT_SHLIB 10
151: #define SHT_DYNSYM 11
152:
153: #define SHT_LOPROC 0x70000000
154: #define SHT_HIPROC 0x7fffffff
155: #define SHT_LOUSER 0x80000000
156: #define SHT_HIUSER 0xffffffff
157:
158: /* section attribute flags - page 4-18, figure 4-11 */
159:
160: #define SHF_WRITE 0x1
161: #define SHF_ALLOC 0x2
162: #define SHF_EXECINSTR 0x4
163: #define SHF_MASKPROC 0xf0000000
164:
165: /* symbol table - page 4-25, figure 4-15 */
166: typedef struct
167: {
168: Elf32_Word st_name;
169: Elf32_Addr st_value;
170: Elf32_Word st_size;
171: unsigned char st_info;
172: unsigned char st_other;
173: Elf32_Half st_shndx;
174: } Elf32_Sym;
175:
176: /* symbol type and binding attributes - page 4-26 */
177:
178: #define ELF32_ST_BIND(i) ((i) >> 4)
179: #define ELF32_ST_TYPE(i) ((i) & 0xf)
180: #define ELF32_ST_INFO(b,t) (((b)<<4)+((t)&0xf))
181:
182: /* symbol binding - page 4-26, figure 4-16 */
183:
184: #define STB_LOCAL 0
185: #define STB_GLOBAL 1
186: #define STB_WEAK 2
187: #define STB_LOPROC 13
188: #define STB_HIPROC 15
189:
190: /* symbol types - page 4-28, figure 4-17 */
191:
192: #define STT_NOTYPE 0
193: #define STT_OBJECT 1
194: #define STT_FUNC 2
195: #define STT_SECTION 3
196: #define STT_FILE 4
197: #define STT_LOPROC 13
198: #define STT_HIPROC 15
199:
200:
201: /* relocation entries - page 4-31, figure 4-19 */
202:
203: typedef struct
204: {
205: Elf32_Addr r_offset;
206: Elf32_Word r_info;
207: } Elf32_Rel;
208:
209: typedef struct
210: {
211: Elf32_Addr r_offset;
212: Elf32_Word r_info;
213: Elf32_Sword r_addend;
214: } Elf32_Rela;
215:
216: /* Macros to split/combine relocation type and symbol page 4-32 */
217:
218: #define ELF32_R_SYM(__i) ((__i)>>8)
219: #define ELF32_R_TYPE(__i) ((unsigned char) (__i))
220: #define ELF32_R_INFO(__s, __t) (((__s)<<8) + (unsigned char) (__t))
221:
222:
223: /* program header - page 5-2, figure 5-1 */
224:
225: typedef struct {
226: Elf32_Word p_type;
227: Elf32_Off p_offset;
228: Elf32_Addr p_vaddr;
229: Elf32_Addr p_paddr;
230: Elf32_Word p_filesz;
231: Elf32_Word p_memsz;
232: Elf32_Word p_flags;
233: Elf32_Word p_align;
234: } Elf32_Phdr;
235:
236: /* segment types - page 5-3, figure 5-2 */
237:
238: #define PT_NULL 0
239: #define PT_LOAD 1
240: #define PT_DYNAMIC 2
241: #define PT_INTERP 3
242: #define PT_NOTE 4
243: #define PT_SHLIB 5
244: #define PT_PHDR 6
245:
246: #define PT_LOPROC 0x70000000
247: #define PT_HIPROC 0x7fffffff
248:
249: /* segment permissions - page 5-6 */
250:
251: #define PF_X 0x1
252: #define PF_W 0x2
253: #define PF_R 0x4
254: #define PF_MASKPROC 0xf0000000
255:
256:
257: /* dynamic structure - page 5-15, figure 5-9 */
258:
259: typedef struct {
260: Elf32_Sword d_tag;
261: union {
262: Elf32_Word d_val;
263: Elf32_Addr d_ptr;
264: } d_un;
265: } Elf32_Dyn;
266:
267: /* Dynamic array tags - page 5-16, figure 5-10. */
268:
269: #define DT_NULL 0
270: #define DT_NEEDED 1
271: #define DT_PLTRELSZ 2
272: #define DT_PLTGOT 3
273: #define DT_HASH 4
274: #define DT_STRTAB 5
275: #define DT_SYMTAB 6
276: #define DT_RELA 7
277: #define DT_RELASZ 8
278: #define DT_RELAENT 9
279: #define DT_STRSZ 10
280: #define DT_SYMENT 11
281: #define DT_INIT 12
282: #define DT_FINI 13
283: #define DT_SONAME 14
284: #define DT_RPATH 15
285: #define DT_SYMBOLIC 16
286: #define DT_REL 17
287: #define DT_RELSZ 18
288: #define DT_RELENT 19
289: #define DT_PLTREL 20
290: #define DT_DEBUG 21
291: #define DT_TEXTREL 22
292: #define DT_JMPREL 23
293:
294: /*
295: * Bootstrap doesn't need machine dependent extensions.
296: */
297:
298: #endif /* _MACH_EXEC_ELF_H_ */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.