Usermode/ld-acess - Added two more ARM relocation types
[tpg/acess2.git] / Kernel / bin / elf.h
1 /**\r
2  * \file elf.h\r
3  * \brief ELF Exeutable Loader\r
4  */\r
5 #ifndef _BIN_ELF_H\r
6 #define _BIN_ELF_H\r
7 \r
8 typedef Uint16  Elf64_Half;\r
9 typedef Uint32  Elf64_Word;\r
10 typedef Uint64  Elf64_Addr;\r
11 typedef Uint64  Elf64_Off;\r
12 typedef Uint64  Elf64_Xword;\r
13 \r
14 enum e_ident_values\r
15 {\r
16         EI_MAG0,\r
17         EI_MAG1,\r
18         EI_MAG2,\r
19         EI_MAG3,\r
20         EI_CLASS,\r
21         EI_DATA,\r
22         EI_VERSION,\r
23         EI_OSABI,\r
24         EI_ABIVERSION,\r
25         EI_PAD,\r
26         EI_NIDENT = 16,\r
27 };\r
28 \r
29 #define ELFCLASS32      1\r
30 #define ELFCLASS64      2\r
31 \r
32 /**\r
33  * \brief ELF File Header\r
34  */\r
35 struct sElf32_Ehdr\r
36 {\r
37         union {\r
38                 char    ident[16];      //!< Identifier Bytes\r
39                 struct {\r
40                         Uint    Ident1;\r
41                         Uint    Ident2;\r
42                         Uint    HashTable;\r
43                         Uint    SymTable;\r
44                 } misc;\r
45         };\r
46         Uint16  filetype;       //!< File Type\r
47         Uint16  machine;        //!< Machine / Arch\r
48         Uint32  version;        //!< Version (File?)\r
49         Uint32  entrypoint;     //!< Entry Point\r
50         Uint32  phoff;  //!< Program Header Offset\r
51         Uint32  shoff;  //!< Section Header Offset\r
52         Uint32  flags;  //!< Flags\r
53         Uint16  headersize;     //!< Header Size\r
54         Uint16  phentsize;      //!< Program Header Entry Size\r
55         Uint16  phentcount;     //!< Program Header Entry Count\r
56         Uint16  shentsize;      //!< Section Header Entry Size\r
57         Uint16  shentcount;     //!< Section Header Entry Count\r
58         Uint16  shstrindex;     //!< Section Header String Table Index\r
59 } __attribute__ ((packed));\r
60 \r
61 typedef struct\r
62 {\r
63         unsigned char   e_ident[16];\r
64         Elf64_Half      e_type;\r
65         Elf64_Half      e_machine;\r
66         Elf64_Word      e_version;\r
67         Elf64_Addr      e_entry;\r
68         Elf64_Off       e_phoff;\r
69         Elf64_Off       e_shoff;\r
70         Elf64_Word      e_flags;\r
71         Elf64_Half      e_ehsize;\r
72         Elf64_Half      e_phentsize;\r
73         Elf64_Half      e_phnum;\r
74         Elf64_Half      e_shentsize;\r
75         Elf64_Half      e_shnum;\r
76         Elf64_Half      e_shstrndx;\r
77 } Elf64_Ehdr;\r
78 \r
79 /**\r
80  * \brief Executable Types\r
81  */\r
82 enum eElf32_ExecTypes\r
83 {\r
84         ET_NONE = 0,    //!< NULL Type\r
85         ET_REL  = 1,    //!< Relocatable (Object)\r
86         ET_EXEC = 2,    //!< Executable\r
87         ET_DYN  = 3,    //!< Dynamic Library\r
88         ET_CORE = 4,    //!< Core?\r
89         ET_LOPROC = 0xFF00,     //!< Low Impl Defined\r
90         ET_HIPROC = 0xFFFF      //!< High Impl Defined\r
91 };\r
92 \r
93 /**\r
94  \name Section IDs\r
95  \{\r
96 */\r
97 #define SHN_UNDEF               0       //!< Undefined Section\r
98 #define SHN_LORESERVE   0xFF00  //!< Low Reserved\r
99 #define SHN_LOPROC      0xFF00  //!< Low Impl Defined\r
100 #define SHN_HIPROC      0xFF1F  //!< High Impl Defined\r
101 #define SHN_ABS         0xFFF1  //!< Absolute Address (Base: 0, Size: -1)\r
102 #define SHN_COMMON      0xFFF2  //!< Common\r
103 #define SHN_HIRESERVE   0xFFFF  //!< High Reserved\r
104 //! \}\r
105 \r
106 /**\r
107  \enum eElfSectionTypes\r
108  \brief ELF Section Types\r
109 */\r
110 enum eElfSectionTypes {\r
111         SHT_NULL,       //0\r
112         SHT_PROGBITS,   //1\r
113         SHT_SYMTAB,     //2\r
114         SHT_STRTAB,     //3\r
115         SHT_RELA,       //4\r
116         SHT_HASH,       //5\r
117         SHT_DYNAMIC,    //6\r
118         SHT_NOTE,       //7\r
119         SHT_NOBITS,     //8\r
120         SHT_REL,        //9\r
121         SHT_SHLIB,      //A\r
122         SHT_DYNSYM,     //B\r
123         SHT_LAST,       //C\r
124         SHT_LOPROC = 0x70000000,\r
125         SHT_HIPROC = 0x7fffffff,\r
126         SHT_LOUSER = 0x80000000,\r
127         SHT_HIUSER = 0xffffffff\r
128 };\r
129 \r
130 #define SHF_WRITE       0x1\r
131 #define SHF_ALLOC       0x2\r
132 #define SHF_EXECINSTR   0x4\r
133 #define SHF_MASKPROC    0xf0000000\r
134 \r
135 struct sElf32_Shent {\r
136         Uint32  name;\r
137         Uint32  type;\r
138         Uint32  flags;\r
139         Uint32  address;\r
140         Uint32  offset;\r
141         Uint32  size;\r
142         Uint32  link;\r
143         Uint32  info;\r
144         Uint32  addralign;\r
145         Uint32  entsize;\r
146 } __attribute__ ((packed));     //sizeof = 40\r
147 \r
148 typedef struct\r
149 {\r
150         Elf64_Word      sh_name;\r
151         Elf64_Word      sh_type;\r
152         Elf64_Xword     sh_flags;\r
153         Elf64_Addr      sh_addr;\r
154         Elf64_Off       sh_offset;\r
155         Elf64_Xword     sh_size;\r
156         Elf64_Word      sh_link;\r
157         Elf64_Word      sh_info;\r
158         Elf64_Xword     sh_addralign;\r
159         Elf64_Xword     sh_entsize;\r
160 } Elf64_Shdr;\r
161 \r
162 struct elf_sym_s {\r
163         union {\r
164                 Uint32  nameOfs;\r
165                 char    *name;\r
166         };\r
167         Uint32  value;  //Address\r
168         Uint32  size;\r
169         Uint8   info;\r
170         Uint8   other;\r
171         Uint16  shndx;\r
172 } __attribute__ ((packed));\r
173 #define STN_UNDEF       0       // Undefined Symbol\r
174 \r
175 enum {\r
176         PT_NULL,        //0\r
177         PT_LOAD,        //1\r
178         PT_DYNAMIC,     //2\r
179         PT_INTERP,      //3\r
180         PT_NOTE,        //4\r
181         PT_SHLIB,       //5\r
182         PT_PHDR,        //6\r
183         PT_LOPROC = 0x70000000,\r
184         PT_HIPROC = 0x7fffffff\r
185 };\r
186 \r
187 struct sElf32_Phdr {\r
188         Uint32  Type;\r
189         Uint32  Offset;\r
190         Uint32  VAddr;\r
191         Uint32  PAddr;\r
192         Uint32  FileSize;\r
193         Uint32  MemSize;\r
194         Uint32  Flags;\r
195         Uint32  Align;\r
196 } __attribute__ ((packed));\r
197 \r
198 typedef struct\r
199 {\r
200         Elf64_Word      p_type;\r
201         Elf64_Word      p_flags;\r
202         Elf64_Off       p_offset;\r
203         Elf64_Addr      p_vaddr;\r
204         Elf64_Addr      p_paddr;\r
205         Elf64_Xword     p_filesz;\r
206         Elf64_Xword     p_memsz;\r
207         Elf64_Xword     p_align;\r
208 } Elf64_Phdr;\r
209 \r
210 #define PF_X    1\r
211 #define PF_W    2\r
212 #define PF_R    4\r
213 \r
214 struct elf32_rel_s {\r
215         Uint32  r_offset;\r
216         Uint32  r_info;\r
217 } __attribute__ ((packed));\r
218 \r
219 struct elf32_rela_s {\r
220         Uint32  r_offset;\r
221         Uint32  r_info;\r
222         Sint32  r_addend;\r
223 } __attribute__ ((packed));\r
224 \r
225 enum {\r
226         R_386_NONE = 0, // none\r
227         R_386_32,       // S+A\r
228         R_386_PC32,     // S+A-P\r
229         R_386_GOT32,    // G+A-P\r
230         R_386_PLT32,    // L+A-P\r
231         R_386_COPY,     // none\r
232         R_386_GLOB_DAT, // S\r
233         R_386_JMP_SLOT, // S\r
234         R_386_RELATIVE, // B+A\r
235         R_386_GOTOFF,   // S+A-GOT\r
236         R_386_GOTPC,    // GOT+A-P\r
237         R_386_LAST      // none\r
238 };\r
239 \r
240 #define ELF32_R_SYM(i)  ((i)>>8)        // Takes an info value and returns a symbol index\r
241 #define ELF32_R_TYPE(i) ((i)&0xFF)      // Takes an info value and returns a type\r
242 #define ELF32_R_INFO(s,t)       (((s)<<8)+((t)&0xFF))   // Takes a type and symbol index and returns an info value\r
243 \r
244 struct elf32_dyn_s {\r
245         Uint32  d_tag;\r
246         Uint32  d_val;  //Also d_ptr\r
247 } __attribute__ ((packed));\r
248 \r
249 enum {\r
250         DT_NULL,        //!< Marks End of list\r
251         DT_NEEDED,      //!< Offset in strtab to needed library\r
252         DT_PLTRELSZ,    //!< Size in bytes of PLT\r
253         DT_PLTGOT,      //!< Address of PLT/GOT\r
254         DT_HASH,        //!< Address of symbol hash table\r
255         DT_STRTAB,      //!< String Table address\r
256         DT_SYMTAB,      //!< Symbol Table address\r
257         DT_RELA,        //!< Relocation table address\r
258         DT_RELASZ,      //!< Size of relocation table\r
259         DT_RELAENT,     //!< Size of entry in relocation table\r
260         DT_STRSZ,       //!< Size of string table\r
261         DT_SYMENT,      //!< Size of symbol table entry\r
262         DT_INIT,        //!< Address of initialisation function\r
263         DT_FINI,        //!< Address of termination function\r
264         DT_SONAME,      //!< String table offset of so name\r
265         DT_RPATH,       //!< String table offset of library path\r
266         DT_SYMBOLIC,//!< Reverse order of symbol searching for library, search libs first then executable\r
267         DT_REL,         //!< Relocation Entries (Elf32_Rel instead of Elf32_Rela)\r
268         DT_RELSZ,       //!< Size of above table (bytes)\r
269         DT_RELENT,      //!< Size of entry in above table\r
270         DT_PLTREL,      //!< Relocation entry of PLT\r
271         DT_DEBUG,       //!< Debugging Entry - Unknown contents\r
272         DT_TEXTREL,     //!< Indicates that modifcations to a non-writeable segment may occur\r
273         DT_JMPREL,      //!< Address of PLT only relocation entries\r
274         DT_LOPROC = 0x70000000, //!< Low Definable\r
275         DT_HIPROC = 0x7FFFFFFF  //!< High Definable\r
276 };\r
277 \r
278 typedef struct sElf32_Ehdr      Elf32_Ehdr;\r
279 typedef struct sElf32_Phdr      Elf32_Phdr;\r
280 typedef struct sElf32_Shent     Elf32_Shent;\r
281 typedef struct elf_sym_s        elf_symtab;\r
282 typedef struct elf_sym_s        Elf32_Sym;\r
283 typedef struct elf32_rel_s      Elf32_Rel;\r
284 typedef struct elf32_rela_s     Elf32_Rela;\r
285 typedef struct elf32_dyn_s      Elf32_Dyn;\r
286 \r
287 #endif  // defined(_EXE_ELF_H)\r

UCC git Repository :: git.ucc.asn.au