source: trunk/src/win32k/include/elf.h@ 5087

Last change on this file since 5087 was 4787, checked in by bird, 25 years ago

Changed email address... (may some dll fixes changes too.)

File size: 18.1 KB
Line 
1/* $Id: elf.h,v 1.6 2000-12-11 06:53:51 bird Exp $
2 *
3 * ELF stuff.
4 *
5 * Copyright (c) 1999-2000 knut st. osmundsen (knut.stange.osmundsen@mynd.no)
6 *
7 * Project Odin Software License can be found in LICENSE.TXT
8 *
9 */
10
11
12#ifndef _elf_h_
13#define _elf_h_
14
15//#pragma pack(1)
16
17/*
18 * Basic ELF types.
19 */
20typedef unsigned long Elf32_Addr; /* Unsigned program address. */
21typedef unsigned short Elf32_Half; /* Unsigned medium integer. */
22typedef signed long Elf32_Off; /* Unsigned file offset. */
23typedef signed long Elf32_Sword; /* Signed large interger. */
24typedef unsigned long Elf32_Word; /* Unsigned large integer. */
25/* unsigned char Unsigned small integer. */
26
27
28
29/*
30 * ELF Header
31 */
32#define EI_INDENT 0x10
33
34typedef struct /* 0x34 */
35{
36 unsigned char e_ident[EI_INDENT]; /* 0x00 ELF Indentification */
37 Elf32_Half e_type; /* 0x10 Object file type */
38 Elf32_Half e_machine; /* 0x12 Machine type */
39 Elf32_Word e_version; /* 0x14 ELF format version */
40 Elf32_Addr e_entry; /* 0x18 Entry point address */
41 Elf32_Off e_phoff; /* 0x1c File offset of the program header table */
42 Elf32_Off e_shoff; /* 0x20 File offset of the section header table */
43 Elf32_Word e_flags; /* 0x24 Processor specific flags */
44 Elf32_Half e_ehsize; /* 0x28 Size of the Elf Header (this structure) */
45 Elf32_Half e_phentsize; /* 0x2a Size of one entry in the program header table */
46 Elf32_Half e_phnum; /* 0x2c Number of entries in the program header table */
47 Elf32_Half e_shentsize; /* 0x2e Size of one entry in the section header table */
48 Elf32_Half e_shnum; /* 0x30 Number of entries in the section header table */
49 Elf32_Half e_shstrndx; /* 0x32 Section header table index of the string table */
50} Elf32_Ehdr;
51
52/* e_idnet - ELF Identification */
53#define EI_MAG0 0 /* File identificator */
54#define EI_MAG1 1 /* File identificator */
55#define EI_MAG2 2 /* File identificator */
56#define EI_MAG3 3 /* File identificator */
57#define EI_CLASS 4 /* File class */
58#define EI_DATA 5 /* Data encoding */
59#define EI_VERSION 6 /* File version */
60#define EI_PAD 7 /* Start of padding bytes */
61 /* EI_MAG[0-4] */
62#define ELFMAG0 0x7f
63#define ELFMAG1 'E'
64#define ELFMAG2 'L'
65#define ELFMAG3 'F'
66#define ELFMAGICLSB ( 0x7f | ('E' << 8) | ('L' << 16) | ('F' << 24))
67#define ELFMAGICMSB ((0x7f << 24) | ('E' << 16) | ('L' << 8) | 'F' )
68 /* EI_CLASS */
69#define ELFCLASSNONE 0 /* Invalid class */
70#define ELFCLASS32 1 /* 32-bit objects */
71#define ELFCLASS64 2 /* 64-bit objects */
72#define ELFCLASSNUM 3 /* ? */
73 /* EI_DATA */
74#define ELFDATANONE 0 /* Invalid data encoding */
75#define ELFDATA2LSB 1 /* Little endian encoding */
76#define ELFDATA2MSB 2 /* Big endian encoding */
77
78/* e_type contents */
79#define ET_NONE 0x0000 /* No file type */
80#define ET_REL 0x0001 /* Relocatable file */
81#define ET_EXEC 0x0002 /* Executable file */
82#define ET_DYN 0x0003 /* Shared object file */
83#define ET_CORE 0x0004 /* Core file */
84#define ET_LOPROC 0xff00 /* Processor-specific - currect value? */
85#define ET_HIPROC 0xffff /* Processor-specific - currect value? */
86
87/* e_machine contents */
88#define EM_NONE 0 /* No machine */
89#define EM_M32 1 /* AT&T WE 32100 */
90#define EM_SPARC 2 /* SPARC */
91#define EM_386 3 /* Intel 80386 */
92#define EM_68K 4 /* Motorola 680000 */
93#define EM_88K 5 /* Motorola 880000 */
94#define EM_486 6 /* Intel 80486 - disused? */
95#define EM_860 7 /* Intel 80860 */
96#define EM_MIPS 8 /* MIPS RS3000 (big endian...) */
97#define EM_MIPS_RS4_BE 10 /* MIPS RS4000 (big endian) */
98#define EM_SPARC64 11 /* SPARC v9 (not official) 64-bit */
99#define EM_PARISC 15 /* HPPA */
100#define EM_SPARC32PLUS 18 /* SUN's "v8plus" */
101#define EM_PPC 20 /* PowerPC */
102#define EM_ALPHA 0x9026 /* Digital Alpha - NB! Interim number */
103
104/* e_version contents */
105#define EV_NONE 0 /* Invalid version */
106#define EV_CURRENT 1 /* Current version */
107#define EV_NUM 2 /* ? */
108
109/* e_flags - Machine Information */
110#define EF_386_NONE 0 /* Intel 80386 has no flags defined */
111#define EF_486_NONE 0 /* Intel 80486 has no flags defined */
112
113
114/*
115 * ELF Sections
116 */
117typedef struct /* 0x28 */
118{
119 Elf32_Word sh_name; /* 0x00 Section name. Index into the section header string table section. */
120 Elf32_Word sh_type; /* 0x04 Section type. Categorizes the contents and semantics. */
121 Elf32_Word sh_flags; /* 0x08 Section flags. */
122 Elf32_Addr sh_addr; /* 0x0c Address to where in memory the section should reside. */
123 Elf32_Off sh_offset; /* 0x10 Offset into the file of the section's data. */
124 Elf32_Word sh_size; /* 0x14 Section's size in bytes. */
125 Elf32_Word sh_link; /* 0x18 Section header table index link. */
126 Elf32_Word sh_info; /* 0x1c Extra information. */
127 Elf32_Word sh_addralign; /* 0x20 Section alignment. */
128 Elf32_Word sh_entsize; /* 0x24 Entry size of some evtentual fixed-sized table entries. */
129} Elf32_Shdr;
130
131/* section indexes (section references) */
132#define SHN_UNDEF 0 /* Undefined/missing/irrelevant/meaningless section reference. */
133#define SHN_LORESERVE 0xff00 /* Lower bound of the reserved indexes. */
134#define SHN_LOPROC 0xff00 /* Processor-specific semantics lower bound. */
135#define SHN_HIPROC 0xff1f /* Processor-specific semantics upper bound. */
136#define SHN_ABS 0xfff1 /* Absolute values for the corresponding reference. */
137#define SHN_COMMON 0xfff2 /* Symbols defined relative to this section are common symbols. */
138#define SHN_HIRESERVE 0xffff /* Upper bound of the reserved indexes. */
139
140/* sh_type */
141#define SHT_NULL 0 /* Inactive section header. All other members have undefined contents. */
142#define SHT_PROGBITS 1 /* Program defined information. */
143#define SHT_SYMTAB 2 /* Symboltable. */
144#define SHT_STRTAB 3 /* Stringtable. */
145#define SHT_RELA 4 /* Relocations with explicit addends. */
146#define SHT_HASH 5 /* Symbol has table. */
147#define SHT_DYNAMIC 6 /* Dynamic linking information. */
148#define SHT_NOTE 7 /* Information tat marks the file in some way. */
149#define SHT_NOBITS 8 /* Occupies no space in the file. */
150#define SHT_REL 9 /* Relocations. */
151#define SHT_SHLIB 10 /* reserved. */
152#define SHT_DYNSYM 11 /* Symboltable used for dynamic loading. */
153#define SHT_NUM 12 /* ? */
154#define SHT_LOPROC 0x70000000L /* Processor-spcific semantics lower bound. */
155#define SHT_HIPROC 0x7fffffffL /* Processor-spcific semantics upper bound. */
156#define SHT_LOUSER 0x80000000L /* Application program specific lower bound. */
157#define SHT_HIUSER 0xffffffffL /* Application program specific upper bound. */
158
159/* sh_flags */
160#define SHF_WRITE 0x1 /* Writable during process execution. */
161#define SHF_ALLOC 0x2 /* The section occupies memory during process execution. */
162#define SHF_EXECINSTR 0x4 /* Executable machine instructs. */
163#define SHF_MASKPROC 0xf0000000L /* Processor-specific semantics bits. */
164
165
166/*
167 * ELF Symbol table
168 */
169typedef struct /* 0x10 */
170{
171 Elf32_Word st_name; /* 0x00 Symbol name. (index) */
172 Elf32_Addr st_value; /* 0x04 Value associated with the symbol. */
173 Elf32_Word st_size; /* 0x08 Size associated with the symbol. */
174 unsigned char st_info; /* 0x0c Symbol type and binding attributes. */
175 unsigned char st_other; /* 0x0d Reserved. (currently 0?) */
176 Elf32_Half st_shndx; /* 0x0e Section index of related section. */
177} Elf32_Sym;
178
179/* symbol table index(es) */
180#define STN_UNDEF 0 /* Reserved symboltable entry. */
181
182/* st_info macros */
183#define ELF32_ST_BIND(i) ((i) >> 4) /* Get the symbol binding attributes from the st_info member. */
184#define ELF32_ST_TYPE(i) ((i) & 0x0f)/* Get the symbol type from the st_info member. */
185#define ELF32_ST_INFO(b,t) ((b << 4) | (t & 0x0f)) /* Build a st_info member. */
186
187/* st_info - binding attributes */
188#define STB_LOCAL 0x0 /* Local symbol. Not visible outside the object file. */
189#define STB_GLOBAL 0x1 /* Global symbol. Visible to everyone. */
190#define STB_WEAK 0x2 /* Weak symbols resemble global symbols, but their definitions have lower precedence. */
191#define STB_LOPROC 0xd /* Processor-specific semantics lower bound. */
192#define STB_HIPROC 0xf /* Processor-specific semantics upper bound. */
193
194/* st_info - types */
195#define STT_NOTYPE 0x0 /* The symbol's type is not defined. */
196#define STT_OBJECT 0x1 /* The symbol is associated with a data object, such as a variable an array, etc. */
197#define STT_FUNC 0x2 /* The symbol is associated with a function or other executable code. */
198#define STT_SECTION 0x3 /* The symbol is associated with a section. */
199#define STT_FILE 0x4 /* Name of the source file... */
200#define STT_LOPROC 0xd /* Processor-specific semantics lower bound. */
201#define STT_HIPROC 0xf /* Processor-specific semantics upper bound. */
202
203
204/*
205 * ELF Relocation
206 */
207typedef struct /* 0x08 */
208{
209 Elf32_Addr r_offset; /* 0x00 Offset or virtual address. */
210 Elf32_Word r_info; /* 0x04 Symbolindex/type. */
211} Elf32_Rel;
212
213typedef struct /* 0x0c */
214{
215 Elf32_Addr r_offset; /* 0x00 Offset or virtual address. */
216 Elf32_Word r_info; /* 0x04 Symbolindex/type. */
217 Elf32_Sword r_addend; /* 0x08 Constant addend. */
218} Elf32_Rela;
219
220/* r_info macro */
221#define ELF32_R_SYM(i) ((i) >> 8) /* Gets symbol index from the r_info member. */
222#define ELF32_R_TYPE(i) ((unsigned char)(i)) /* Get the relocation type from the r_info member. */
223#define ELF32_R_INFO(s,t) (((s) << 8) | (unsigned char)(t)) /* Makes the r_info member. */
224
225/* r_info - Intel 80386 relocations */
226#define R_386_NONE 0 /* */
227#define R_386_32 1
228#define R_386_PC32 2
229#define R_386_GOT32 3
230#define R_386_PLT32 4
231#define R_386_COPY 5
232#define R_386_GLOB_DAT 6
233#define R_386_JMP_SLOT 7
234#define R_386_RELATIVE 8
235#define R_386_GOT_OFF 9
236#define R_386_GOTPC 10
237#define R_386_NUM 11
238
239
240
241/*
242 * ELF Program Header
243 */
244typedef struct /* 0x20 */
245{
246 Elf32_Word p_type; /* 0x00 Tells what this header describes or how to interpret it. */
247 Elf32_Off p_offset; /* 0x04 Offset of the first byte of this segment. */
248 Elf32_Addr p_vaddr; /* 0x08 Virtual address of the segment. */
249 Elf32_Addr p_paddr; /* 0x0c Physical address. Usually ignorable. */
250 Elf32_Word p_filesz; /* 0x10 Count of bytes in the file image of this segment. Zero allowed. */
251 Elf32_Word p_memsz; /* 0x14 Count of bytes in the memory image of this segment. Zero allowed. */
252 Elf32_Word p_flags; /* 0x18 Flags relevant to the segement. */
253 Elf32_Word p_align; /* 0x1c Alignment. 0 and 1 means no alignment. */
254} Elf32_Phdr;
255
256/* p_type - segment types */
257#define PT_NULL 0 /* Unused header. */
258#define PT_LOAD 1 /* Loadable segment. p_filesz, p_memsz and p_vaddr applies. */
259#define PT_DYNAMIC 2 /* Dynamic linking information. */
260#define PT_INTERP 3 /* Interpreter path. */
261#define PT_NOTE 4 /* Auxiliary information. */
262#define PT_SHLIB 5 /* Reserved. */
263#define PT_PHDR 6 /* This header specifies the location and size of the program header table in file and memory. */
264#define PT_LOPROC 0x70000000 /* Reserved processor-specific semantics range start. */
265#define PT_HIPROC 0x7fffffff /* Reserved processor-specific semantics range end (included). */
266
267/* p_flags - permission flags */
268#define PF_X 1 /* Executable */
269#define PF_W 2 /* Writeable */
270#define PF_R 4 /* Readable */
271
272
273/*
274 * Dynamic Structure
275 */
276typedef struct /* 0x08 */
277{
278 Elf32_Sword d_tag; /* 0x00 Tag type. */
279 union
280 {
281 Elf32_Word d_val; /* 0x04 Value, interpreted according to the tag type. */
282 Elf32_Addr d_ptr; /* 0x04 Virtual address, interpreted according to the tag type. */
283 } d_un;
284} Elf32_Dyn;
285
286/* d_tag - tag types */ /* d_un exe so: '-' is ignored; '+' is mandatory; '*' is optional. */
287#define DT_NULL 0 /* - - - Marks the end of the dynamic array. */
288#define DT_NEEDED 1 /* d_val * * This element holds the string table offset of a
289 null-terminated string, giving the name of a needed
290 library. The offset is an index into the table
291 recoreded in the DT_STRTAB entry. */
292#define DT_PLTRELSZ 2 /* d_val * * This element holds the total size, in bytes, of the
293 relocation entries associated with the procedure
294 linkage table. If an entry of type DT_JMPREL is
295 present, a DT_PLTRELSZ must accompany it. */
296#define DT_PLTGOT 3 /* d_ptr * * */
297#define DT_HASH 4 /* d_ptr + + */
298#define DT_STRTAB 5 /* d_ptr + + This element holds the address of the string table.
299 Symbol names, library names, and other strings reside
300 in this table. */
301#define DT_SYMTAB 6 /* d_ptr + + */
302#define DT_RELA 7 /* d_ptr + * */
303#define DT_RELASZ 8 /* d_val + * */
304#define DT_RELAENT 9 /* d_val + * */
305#define DT_STRSZ 10 /* d_val + + */
306#define DT_SYMENT 11 /* d_val + + */
307#define DT_INIT 12 /* d_ptr * * This element holds the address of the initialization function. */
308#define DT_FINI 13 /* d_ptr * * This element holds the address of the termination function. */
309#define DT_SONAME 14 /* d_val - * This element holds the string table offset of a
310 null-terminated string, giving the name of the shared
311 object. The offset is an index into the table recorded
312 in the DT_STRTAB entry. */
313#define DT_RPATH 15 /* d_val + + This element holds the string table offset of a null-terminated
314 search library search path string. The offset is an index int
315 the table recorded in the DT_STRTAB entry. */
316#define DT_SYMBOLIC 16 /* - - * This element's presence in a shared object library alters the
317 dynamic linker's symbol resolution algorithm for references
318 within the library. Instead of starting a symbol search with
319 the executable file, the dynamic linker starts from the shared
320 object file itself. If the shared object fails to supply the
321 referenced symbol, the dynamic linker then searches the
322 executable file and other shared objects as usual. */
323#define DT_REL 17 /* d_ptr + * */
324#define DT_RELSZ 18 /* d_val + * */
325#define DT_RELENT 19 /* d_val + * */
326#define DT_PLTREL 20 /* d_val * * */
327#define DT_DEBUG 21 /* d_ptr * - */
328#define DT_TEXTREL 22 /* - * * */
329#define DT_JMPREL 23 /* d_ptr * * */
330#define DT_LOPROC 0x70000000 /* Reserved processor-specific semantics range start. */
331#define DT_HIPROC 0x7fffffff /* Reserved processor-specific semantics range end (included). */
332
333#pragma pack()
334#endif /*_elf_h_*/
Note: See TracBrowser for help on using the repository browser.