Working on a kernel elf loader.
[newos.git] / include / sys / elf32.h
blob12fb4f078dc5fdf5406e269722fc9fef603e5553
1 /*
2 ** Copyright 2001, Travis Geiselbrecht. All rights reserved.
3 ** Distributed under the terms of the NewOS License.
4 */
5 #ifndef _ELF32_H
6 #define _ELF32_H
8 #include <types.h>
10 typedef uint32 Elf32_Addr;
11 typedef uint16 Elf32_Half;
12 typedef uint32 Elf32_Off;
13 typedef int32 Elf32_Sword;
14 typedef uint32 Elf32_Word;
16 #define ELF_MAGIC "\x7f""ELF"
17 #define EI_MAG0 0
18 #define EI_MAG1 1
19 #define EI_MAG2 2
20 #define EI_MAG3 3
21 #define EI_CLASS 4
22 #define EI_DATA 5
23 #define EI_VERSION 6
24 #define EI_PAD 7
25 #define EI_NIDENT 16
27 #define ELFCLASS32 1
28 #define ELFCLASS64 2
29 #define ELFDATA2LSB 1
30 #define ELFDATA2MSB 2
32 struct Elf32_Ehdr {
33 unsigned char e_ident[EI_NIDENT];
34 Elf32_Half e_type;
35 Elf32_Half e_machine;
36 Elf32_Word e_version;
37 Elf32_Addr e_entry;
38 Elf32_Off e_phoff;
39 Elf32_Off e_shoff;
40 Elf32_Word e_flags;
41 Elf32_Half e_ehsize;
42 Elf32_Half e_phentsize;
43 Elf32_Half e_phnum;
44 Elf32_Half e_shentsize;
45 Elf32_Half e_shnum;
46 Elf32_Half e_shstrndx;
47 } ;
49 struct Elf32_Shdr {
50 Elf32_Word sh_name;
51 Elf32_Word sh_type;
52 Elf32_Word sh_flags;
53 Elf32_Addr sh_addr;
54 Elf32_Off sh_offset;
55 Elf32_Word sh_size;
56 Elf32_Word sh_link;
57 Elf32_Word sh_info;
58 Elf32_Word sh_addralign;
59 Elf32_Word sh_entsize;
60 } ;
62 #define SHT_NULL 0
63 #define SHT_PROGBITS 1
64 #define SHT_SYMTAB 2
65 #define SHT_STRTAB 3
66 #define SHT_RELA 4
67 #define SHT_HASH 5
68 #define SHT_DYNAMIC 6
69 #define SHT_NOTE 7
70 #define SHT_NOBITS 8
71 #define SHT_REL 9
72 #define SHT_SHLIB 10
73 #define SHT_DYNSYM 11
74 #define SHT_LOPROC 0x70000000
75 #define SHT_HIPROC 0x7fffffff
76 #define SHT_LOUSER 0x80000000
77 #define SHT_HIUSER 0xffffffff
79 #define SHF_WRITE 1
81 struct Elf32_Phdr {
82 Elf32_Word p_type;
83 Elf32_Off p_offset;
84 Elf32_Addr p_vaddr;
85 Elf32_Addr p_paddr;
86 Elf32_Word p_filesz;
87 Elf32_Word p_memsz;
88 Elf32_Word p_flags;
89 Elf32_Word p_align;
90 } ;
92 #define PF_X 0x1
93 #define PF_W 0x2
94 #define PF_R 0x4
95 #define PF_MASKPROC 0xf0000000
98 #define PT_NULL 0
99 #define PT_LOAD 1
100 #define PT_DYNAMIC 2
101 #define PT_INTERP 3
102 #define PT_NOTE 4
103 #define PT_SHLIB 5
104 #define PT_PHDR 6
105 #define PT_LOPROC 0x70000000
106 #define PT_HIPROC 0x7fffffff
108 struct Elf32_Sym {
109 Elf32_Word st_name;
110 Elf32_Addr st_value;
111 Elf32_Word st_size;
112 unsigned char st_info;
113 unsigned char st_other;
114 Elf32_Half st_shndx;
117 #define ELF32_ST_BIND(i) ((i) >> 4)
118 #define ELF32_ST_TYPE(i) ((i) & 0xf)
119 #define ELF32_ST_INFO(b, t) (((b) << 4) + ((t) & 0xf))
121 #define STT_NOTYPE 0
122 #define STT_OBJECT 1
123 #define STT_FUNC 2
124 #define STT_SECTION 3
125 #define STT_FILE 4
126 #define STT_LOPROC 13
127 #define STT_HIPROC 15
129 #define STN_UNDEF 0
131 struct Elf32_Rel {
132 Elf32_Addr r_offset;
133 Elf32_Word r_info;
136 struct Elf32_Rela {
137 Elf32_Addr r_offset;
138 Elf32_Word r_info;
139 Elf32_Sword r_addend;
142 #define ELF32_R_SYM(i) ((i) >> 8)
143 #define ELF32_R_TYPE(i) ((unsigned char)(i))
144 #define ELF32_R_INFO(s, t) (((s) << 8) + (unsigned char)(t))
146 struct Elf32_Dyn {
147 Elf32_Sword d_tag;
148 union {
149 Elf32_Word d_val;
150 Elf32_Addr d_ptr;
151 } d_un;
154 #define DT_NULL 0
155 #define DT_NEEDED 1
156 #define DT_PLTRELSZ 2
157 #define DT_PLTGOT 3
158 #define DT_HASH 4
159 #define DT_STRTAB 5
160 #define DT_SYMTAB 6
161 #define DT_RELA 7
162 #define DT_RELASZ 8
163 #define DT_RELAENT 9
164 #define DT_STRSZ 10
165 #define DT_SYMENT 11
166 #define DT_INIT 12
167 #define DT_FINI 13
168 #define DT_SONAME 14
169 #define DT_RPATH 15
170 #define DT_SYMBOLIC 16
171 #define DT_REL 17
172 #define DT_RELSZ 18
173 #define DT_RELENT 19
174 #define DT_PLTREL 20
175 #define DT_DEBUG 21
176 #define DT_TEXTREL 22
177 #define DT_JMPREL 23
178 #define DT_LOPROC 0x70000000
179 #define DT_HIPROC 0x7fffffff
181 #endif