OpenAMP Library  353
elf_loader.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2014, Mentor Graphics Corporation
3  * All rights reserved.
4  *
5  * SPDX-License-Identifier: BSD-3-Clause
6  */
7 
8 #ifndef ELF_LOADER_H_
9 #define ELF_LOADER_H_
10 
11 #include <openamp/remoteproc.h>
13 
14 #if defined __cplusplus
15 extern "C" {
16 #endif
17 
18 /* ELF32 base types - 32-bit. */
19 typedef uint32_t Elf32_Addr;
20 typedef uint16_t Elf32_Half;
21 typedef uint32_t Elf32_Off;
22 typedef int32_t Elf32_Sword;
23 typedef uint32_t Elf32_Word;
24 
25 /* ELF64 base types - 64-bit. */
26 typedef uint64_t Elf64_Addr;
27 typedef uint16_t Elf64_Half;
28 typedef uint64_t Elf64_Off;
29 typedef int32_t Elf64_Sword;
30 typedef uint32_t Elf64_Word;
31 typedef uint64_t Elf64_Xword;
32 typedef int64_t Elf64_Sxword;
33 
34 /* Size of ELF identifier field in the ELF file header. */
35 #define EI_NIDENT 16
36 
37 /* ELF32 file header */
38 typedef struct {
39  unsigned char e_ident[EI_NIDENT];
53 } Elf32_Ehdr;
54 
55 /* ELF64 file header */
56 typedef struct {
57  unsigned char e_ident[EI_NIDENT];
71 } Elf64_Ehdr;
72 
73 /* e_ident */
74 #define ET_NONE 0
75 #define ET_REL 1 /* Re-locatable file */
76 #define ET_EXEC 2 /* Executable file */
77 #define ET_DYN 3 /* Shared object file */
78 #define ET_CORE 4 /* Core file */
79 #define ET_LOOS 0xfe00 /* Operating system-specific */
80 #define ET_HIOS 0xfeff /* Operating system-specific */
81 #define ET_LOPROC 0xff00 /* remote_proc-specific */
82 #define ET_HIPROC 0xffff /* remote_proc-specific */
83 
84 /* e_machine */
85 #define EM_ARM 40 /* ARM/Thumb Architecture */
86 
87 /* e_version */
88 #define EV_CURRENT 1 /* Current version */
89 
90 /* e_ident[] Identification Indexes */
91 #define EI_MAG0 0 /* File identification */
92 #define EI_MAG1 1 /* File identification */
93 #define EI_MAG2 2 /* File identification */
94 #define EI_MAG3 3 /* File identification */
95 #define EI_CLASS 4 /* File class */
96 #define EI_DATA 5 /* Data encoding */
97 #define EI_VERSION 6 /* File version */
98 #define EI_OSABI 7 /* Operating system/ABI identification */
99 #define EI_ABIVERSION 8 /* ABI version */
100 #define EI_PAD 9 /* Start of padding bytes */
101 #define EI_NIDENT 16 /* Size of e_ident[] */
102 
103 /*
104  * EI_MAG0 to EI_MAG3 - A file's first 4 bytes hold amagic number, identifying
105  * the file as an ELF object file
106  */
107 #define ELFMAG0 0x7f /* e_ident[EI_MAG0] */
108 #define ELFMAG1 'E' /* e_ident[EI_MAG1] */
109 #define ELFMAG2 'L' /* e_ident[EI_MAG2] */
110 #define ELFMAG3 'F' /* e_ident[EI_MAG3] */
111 #define ELFMAG "\177ELF"
112 #define SELFMAG 4
113 
114 /*
115  * EI_CLASS - The next byte, e_ident[EI_CLASS], identifies the file's class, or
116  * capacity.
117  */
118 #define ELFCLASSNONE 0 /* Invalid class */
119 #define ELFCLASS32 1 /* 32-bit objects */
120 #define ELFCLASS64 2 /* 64-bit objects */
121 
122 /*
123  * EI_DATA - Byte e_ident[EI_DATA] specifies the data encoding of the
124  * remote_proc-specific data in the object file. The following encodings are
125  * currently defined.
126  */
127 #define ELFDATANONE 0 /* Invalid data encoding */
128 #define ELFDATA2LSB 1 /* See Data encodings, below */
129 #define ELFDATA2MSB 2 /* See Data encodings, below */
130 
131 /* EI_OSABI - We do not define an OS specific ABI */
132 #define ELFOSABI_NONE 0
133 
134 /* ELF32 program header */
135 typedef struct elf32_phdr {
145 
146 /* ELF64 program header */
147 typedef struct elf64_phdr {
157 
158 /* segment types */
159 #define PT_NULL 0
160 #define PT_LOAD 1
161 #define PT_DYNAMIC 2
162 #define PT_INTERP 3
163 #define PT_NOTE 4
164 #define PT_SHLIB 5
165 #define PT_PHDR 6
166 #define PT_TLS 7 /* Thread local storage segment */
167 #define PT_LOOS 0x60000000 /* OS-specific */
168 #define PT_HIOS 0x6fffffff /* OS-specific */
169 #define PT_LOPROC 0x70000000
170 #define PT_HIPROC 0x7fffffff
171 
172 /* ELF32 section header. */
173 typedef struct {
184 } Elf32_Shdr;
185 
186 /* ELF64 section header. */
187 typedef struct {
198 } Elf64_Shdr;
199 
200 /* sh_type */
201 #define SHT_NULL 0
202 #define SHT_PROGBITS 1
203 #define SHT_SYMTAB 2
204 #define SHT_STRTAB 3
205 #define SHT_RELA 4
206 #define SHT_HASH 5
207 #define SHT_DYNAMIC 6
208 #define SHT_NOTE 7
209 #define SHT_NOBITS 8
210 #define SHT_REL 9
211 #define SHT_SHLIB 10
212 #define SHT_DYNSYM 11
213 #define SHT_INIT_ARRAY 14
214 #define SHT_FINI_ARRAY 15
215 #define SHT_PREINIT_ARRAY 16
216 #define SHT_GROUP 17
217 #define SHT_SYMTAB_SHNDX 18
218 #define SHT_LOOS 0x60000000
219 #define SHT_HIOS 0x6fffffff
220 #define SHT_LOPROC 0x70000000
221 #define SHT_HIPROC 0x7fffffff
222 #define SHT_LOUSER 0x80000000
223 #define SHT_HIUSER 0xffffffff
224 
225 /* sh_flags */
226 #define SHF_WRITE 0x1
227 #define SHF_ALLOC 0x2
228 #define SHF_EXECINSTR 0x4
229 #define SHF_MASKPROC 0xf0000000
230 
231 /* Relocation entry (without addend) */
232 typedef struct {
235 } Elf32_Rel;
236 
237 typedef struct {
240 } Elf64_Rel;
241 
242 /* Relocation entry with addend */
243 typedef struct {
247 } Elf32_Rela;
248 
249 typedef struct elf64_rela {
254 
255 /* Macros to extract information from 'r_info' field of relocation entries */
256 #define ELF32_R_SYM(i) ((i) >> 8)
257 #define ELF32_R_TYPE(i) ((unsigned char)(i))
258 #define ELF64_R_SYM(i) ((i) >> 32)
259 #define ELF64_R_TYPE(i) ((i) & 0xffffffff)
260 
261 /* Symbol table entry */
262 typedef struct {
266  unsigned char st_info;
267  unsigned char st_other;
269 } Elf32_Sym;
270 
271 typedef struct elf64_sym {
273  unsigned char st_info;
274  unsigned char st_other;
279 
280 /* ARM specific dynamic relocation codes */
281 #define R_ARM_GLOB_DAT 21 /* 0x15 */
282 #define R_ARM_JUMP_SLOT 22 /* 0x16 */
283 #define R_ARM_RELATIVE 23 /* 0x17 */
284 #define R_ARM_ABS32 2 /* 0x02 */
285 
286 /* ELF decoding information */
287 struct elf32_info {
292  void *shstrtab;
293 };
294 
295 struct elf64_info {
300  void *shstrtab;
301 };
302 
303 #define ELF_STATE_INIT 0x0L
304 #define ELF_STATE_WAIT_FOR_PHDRS 0x100L
305 #define ELF_STATE_WAIT_FOR_SHDRS 0x200L
306 #define ELF_STATE_WAIT_FOR_SHSTRTAB 0x400L
307 #define ELF_STATE_HDRS_COMPLETE 0x800L
308 #define ELF_STATE_MASK 0xFF00L
309 #define ELF_NEXT_SEGMENT_MASK 0x00FFL
310 
311 extern const struct loader_ops elf_ops;
312 
326 int elf_identify(const void *img_data, size_t len);
327 
348 int elf_load_header(const void *img_data, size_t offset, size_t len,
349  void **img_info, int last_load_state,
350  size_t *noffset, size_t *nlen);
351 
390 int elf_load(struct remoteproc *rproc, const void *img_data,
391  size_t offset, size_t len,
392  void **img_info, int last_load_state,
393  metal_phys_addr_t *da,
394  size_t *noffset, size_t *nlen,
395  unsigned char *padding, size_t *nmemsize);
396 
406 void elf_release(void *img_info);
407 
419 metal_phys_addr_t elf_get_entry(void *img_info);
420 
438 int elf_locate_rsc_table(void *img_info, metal_phys_addr_t *da,
439  size_t *offset, size_t *size);
440 
441 #if defined __cplusplus
442 }
443 #endif
444 
445 #endif /* ELF_LOADER_H_ */
metal_phys_addr_t elf_get_entry(void *img_info)
Definition: elf_loader.c:650
uint16_t Elf32_Half
Definition: elf_loader.h:20
int32_t Elf32_Sword
Definition: elf_loader.h:22
int32_t Elf64_Sword
Definition: elf_loader.h:29
uint32_t Elf32_Addr
Definition: elf_loader.h:19
struct elf64_sym Elf64_Sym
uint64_t Elf64_Xword
Definition: elf_loader.h:31
int64_t Elf64_Sxword
Definition: elf_loader.h:32
uint32_t Elf32_Off
Definition: elf_loader.h:21
struct elf32_phdr Elf32_Phdr
int elf_load(struct remoteproc *rproc, const void *img_data, size_t offset, size_t len, void **img_info, int last_load_state, metal_phys_addr_t *da, size_t *noffset, size_t *nlen, unsigned char *padding, size_t *nmemsize)
Definition: elf_loader.c:534
uint64_t Elf64_Off
Definition: elf_loader.h:28
int elf_load_header(const void *img_data, size_t offset, size_t len, void **img_info, int last_load_state, size_t *noffset, size_t *nlen)
Definition: elf_loader.c:395
const struct loader_ops elf_ops
Definition: elf_loader.c:705
uint32_t Elf64_Word
Definition: elf_loader.h:30
int elf_locate_rsc_table(void *img_info, metal_phys_addr_t *da, size_t *offset, size_t *size)
Definition: elf_loader.c:670
struct elf64_rela Elf64_Rela
void elf_release(void *img_info)
Definition: elf_loader.c:622
struct elf64_phdr Elf64_Phdr
uint16_t Elf64_Half
Definition: elf_loader.h:27
#define EI_NIDENT
Definition: elf_loader.h:101
int elf_identify(const void *img_data, size_t len)
Definition: elf_loader.c:385
uint64_t Elf64_Addr
Definition: elf_loader.h:26
uint32_t Elf32_Word
Definition: elf_loader.h:23
Definition: elf_loader.h:38
Elf32_Off e_shoff
Definition: elf_loader.h:45
Elf32_Half e_ehsize
Definition: elf_loader.h:47
Elf32_Half e_shnum
Definition: elf_loader.h:51
Elf32_Half e_machine
Definition: elf_loader.h:41
Elf32_Off e_phoff
Definition: elf_loader.h:44
Elf32_Half e_phnum
Definition: elf_loader.h:49
Elf32_Half e_shstrndx
Definition: elf_loader.h:52
Elf32_Half e_type
Definition: elf_loader.h:40
Elf32_Word e_flags
Definition: elf_loader.h:46
Elf32_Word e_version
Definition: elf_loader.h:42
Elf32_Half e_shentsize
Definition: elf_loader.h:50
Elf32_Addr e_entry
Definition: elf_loader.h:43
Elf32_Half e_phentsize
Definition: elf_loader.h:48
Definition: elf_loader.h:232
Elf32_Word r_info
Definition: elf_loader.h:234
Elf32_Addr r_offset
Definition: elf_loader.h:233
Definition: elf_loader.h:243
Elf32_Sword r_addend
Definition: elf_loader.h:246
Elf32_Addr r_offset
Definition: elf_loader.h:244
Elf32_Word r_info
Definition: elf_loader.h:245
Definition: elf_loader.h:173
Elf32_Word sh_entsize
Definition: elf_loader.h:183
Elf32_Word sh_flags
Definition: elf_loader.h:176
Elf32_Word sh_addralign
Definition: elf_loader.h:182
Elf32_Off sh_offset
Definition: elf_loader.h:178
Elf32_Word sh_name
Definition: elf_loader.h:174
Elf32_Addr sh_addr
Definition: elf_loader.h:177
Elf32_Word sh_size
Definition: elf_loader.h:179
Elf32_Word sh_type
Definition: elf_loader.h:175
Elf32_Word sh_link
Definition: elf_loader.h:180
Elf32_Word sh_info
Definition: elf_loader.h:181
Definition: elf_loader.h:262
Elf32_Word st_size
Definition: elf_loader.h:265
unsigned char st_other
Definition: elf_loader.h:267
Elf32_Half st_shndx
Definition: elf_loader.h:268
Elf32_Word st_name
Definition: elf_loader.h:263
unsigned char st_info
Definition: elf_loader.h:266
Elf32_Addr st_value
Definition: elf_loader.h:264
Definition: elf_loader.h:56
Elf64_Half e_type
Definition: elf_loader.h:58
Elf64_Half e_shentsize
Definition: elf_loader.h:68
Elf64_Half e_shnum
Definition: elf_loader.h:69
Elf64_Word e_version
Definition: elf_loader.h:60
Elf64_Half e_ehsize
Definition: elf_loader.h:65
Elf64_Off e_shoff
Definition: elf_loader.h:63
Elf64_Addr e_entry
Definition: elf_loader.h:61
Elf64_Half e_phentsize
Definition: elf_loader.h:66
Elf64_Off e_phoff
Definition: elf_loader.h:62
Elf64_Half e_machine
Definition: elf_loader.h:59
Elf64_Word e_flags
Definition: elf_loader.h:64
Elf64_Half e_shstrndx
Definition: elf_loader.h:70
Elf64_Half e_phnum
Definition: elf_loader.h:67
Definition: elf_loader.h:237
Elf64_Xword r_info
Definition: elf_loader.h:239
Elf64_Addr r_offset
Definition: elf_loader.h:238
Definition: elf_loader.h:187
Elf64_Word sh_name
Definition: elf_loader.h:188
Elf64_Xword sh_flags
Definition: elf_loader.h:190
Elf64_Word sh_link
Definition: elf_loader.h:194
Elf64_Word sh_type
Definition: elf_loader.h:189
Elf64_Word sh_info
Definition: elf_loader.h:195
Elf64_Xword sh_entsize
Definition: elf_loader.h:197
Elf64_Xword sh_size
Definition: elf_loader.h:193
Elf64_Xword sh_addralign
Definition: elf_loader.h:196
Elf64_Addr sh_addr
Definition: elf_loader.h:191
Elf64_Off sh_offset
Definition: elf_loader.h:192
Definition: elf_loader.h:287
Elf32_Shdr * shdrs
Definition: elf_loader.h:291
Elf32_Phdr * phdrs
Definition: elf_loader.h:290
int load_state
Definition: elf_loader.h:289
void * shstrtab
Definition: elf_loader.h:292
Elf32_Ehdr ehdr
Definition: elf_loader.h:288
Definition: elf_loader.h:135
Elf32_Word p_align
Definition: elf_loader.h:143
Elf32_Word p_filesz
Definition: elf_loader.h:140
Elf32_Addr p_vaddr
Definition: elf_loader.h:138
Elf32_Addr p_paddr
Definition: elf_loader.h:139
Elf32_Word p_flags
Definition: elf_loader.h:142
Elf32_Word p_type
Definition: elf_loader.h:136
Elf32_Word p_memsz
Definition: elf_loader.h:141
Elf32_Off p_offset
Definition: elf_loader.h:137
Definition: elf_loader.h:295
Elf64_Ehdr ehdr
Definition: elf_loader.h:296
void * shstrtab
Definition: elf_loader.h:300
Elf64_Shdr * shdrs
Definition: elf_loader.h:299
Elf64_Phdr * phdrs
Definition: elf_loader.h:298
int load_state
Definition: elf_loader.h:297
Definition: elf_loader.h:147
Elf64_Off p_offset
Definition: elf_loader.h:150
Elf64_Addr p_vaddr
Definition: elf_loader.h:151
Elf64_Xword p_memsz
Definition: elf_loader.h:154
Elf64_Word p_flags
Definition: elf_loader.h:149
Elf64_Xword p_filesz
Definition: elf_loader.h:153
Elf64_Word p_type
Definition: elf_loader.h:148
Elf64_Xword p_align
Definition: elf_loader.h:155
Elf64_Addr p_paddr
Definition: elf_loader.h:152
Definition: elf_loader.h:249
Elf64_Sxword r_addend
Definition: elf_loader.h:252
Elf64_Xword r_info
Definition: elf_loader.h:251
Elf64_Addr r_offset
Definition: elf_loader.h:250
Definition: elf_loader.h:271
Elf64_Half st_shndx
Definition: elf_loader.h:275
unsigned char st_other
Definition: elf_loader.h:274
unsigned char st_info
Definition: elf_loader.h:273
Elf64_Word st_name
Definition: elf_loader.h:272
Elf64_Xword st_size
Definition: elf_loader.h:277
Elf64_Addr st_value
Definition: elf_loader.h:276
Loader operations.
Definition: remoteproc_loader.h:76
A remote processor instance.
Definition: remoteproc.h:396