OpenAMP Library  latest
Loading...
Searching...
No Matches
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
15extern "C" {
16#endif
17
18/* ELF32 base types - 32-bit. */
19typedef uint32_t Elf32_Addr;
20typedef uint16_t Elf32_Half;
21typedef uint32_t Elf32_Off;
22typedef int32_t Elf32_Sword;
23typedef uint32_t Elf32_Word;
24
25/* ELF64 base types - 64-bit. */
26typedef uint64_t Elf64_Addr;
27typedef uint16_t Elf64_Half;
28typedef uint64_t Elf64_Off;
29typedef int32_t Elf64_Sword;
30typedef uint32_t Elf64_Word;
31typedef uint64_t Elf64_Xword;
32typedef 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 */
54
55/* ELF64 file header */
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 */
145
146/* ELF64 program header */
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. */
185
186/* ELF64 section header. */
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) */
236
241
242/* Relocation entry with addend */
248
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 */
270
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 */
294
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
311extern const struct loader_ops elf_ops;
312
326int elf_identify(const void *img_data, size_t len);
327
348int 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
390int 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
406void elf_release(void *img_info);
407
419metal_phys_addr_t elf_get_entry(void *img_info);
420
438int 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:35
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
unsigned char e_ident[EI_NIDENT]
Definition elf_loader.h:39
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
unsigned char e_ident[EI_NIDENT]
Definition elf_loader.h:57
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