SyterKit 0.4.0.x
SyterKit is a bare-metal framework
Loading...
Searching...
No Matches
elf_helpers.h
Go to the documentation of this file.
1/* SPDX-License-Identifier: GPL-2.0 */
2
3#ifndef ELF_LOADER_H
4#define ELF_LOADER_H
5
6#include <stdbool.h>
7#include <stddef.h>
8#include <stdint.h>
9#include <string.h>
10#include <types.h>
11
12#include <elf.h>
13
14#ifdef __cplusplus
15extern "C" {
16#endif// __cplusplus
17
18static inline u8 fw_elf_get_class(u32 elf_fw_addr) {
19 struct elf32_hdr *ehdr = (struct elf32_hdr *) elf_fw_addr;
20
21 return ehdr->e_ident[EI_CLASS];
22}
23
24static inline void elf_hdr_init_ident(struct elf32_hdr *hdr, u8 class) {
26 hdr->e_ident[EI_CLASS] = class;
30}
31
32/* Generate getter and setter for a specific elf struct/field */
33#define ELF_GEN_FIELD_GET_SET(__s, __field, __type) \
34 static inline __type elf_##__s##_get_##__field(u8 class, const void *arg) { \
35 if (class == ELFCLASS32) \
36 return (__type) ((const struct elf32_##__s *) arg)->__field; \
37 else \
38 return (__type) ((const struct elf64_##__s *) arg)->__field; \
39 } \
40 static inline void elf_##__s##_set_##__field(u8 class, void *arg, __type value) { \
41 if (class == ELFCLASS32) \
42 ((struct elf32_##__s *) arg)->__field = (__type) value; \
43 else \
44 ((struct elf64_##__s *) arg)->__field = (__type) value; \
45 }
46
59
60ELF_GEN_FIELD_GET_SET(phdr, p_paddr, u64)
61ELF_GEN_FIELD_GET_SET(phdr, p_vaddr, u64)
62ELF_GEN_FIELD_GET_SET(phdr, p_filesz, u64)
63ELF_GEN_FIELD_GET_SET(phdr, p_memsz, u64)
64ELF_GEN_FIELD_GET_SET(phdr, p_type, u32)
65ELF_GEN_FIELD_GET_SET(phdr, p_offset, u64)
66ELF_GEN_FIELD_GET_SET(phdr, p_flags, u32)
67ELF_GEN_FIELD_GET_SET(phdr, p_align, u64)
68
69ELF_GEN_FIELD_GET_SET(shdr, sh_type, u32)
70ELF_GEN_FIELD_GET_SET(shdr, sh_flags, u32)
71ELF_GEN_FIELD_GET_SET(shdr, sh_entsize, u16)
72ELF_GEN_FIELD_GET_SET(shdr, sh_size, u64)
73ELF_GEN_FIELD_GET_SET(shdr, sh_offset, u64)
74ELF_GEN_FIELD_GET_SET(shdr, sh_name, u32)
75ELF_GEN_FIELD_GET_SET(shdr, sh_addr, u64)
76
77#define ELF_STRUCT_SIZE(__s) \
78 static inline unsigned long elf_size_of_##__s(u8 class) { \
79 if (class == ELFCLASS32) \
80 return sizeof(struct elf32_##__s); \
81 else \
82 return sizeof(struct elf64_##__s); \
83 }
84
88
89#ifdef __cplusplus
90}
91#endif// __cplusplus
92
93#endif /* ELF_LOADER_H */
void * memcpy(void *dest, const void *src, size_t len)
Definition string.c:25
#define ELFOSABI_NONE
Definition elf.h:361
#define EI_CLASS
Definition elf.h:335
#define SELFMAG
Definition elf.h:346
#define EI_DATA
Definition elf.h:336
#define EV_CURRENT
Definition elf.h:358
#define EI_OSABI
Definition elf.h:338
#define EI_VERSION
Definition elf.h:337
#define ELFMAG
Definition elf.h:345
#define ELFDATA2LSB
Definition elf.h:354
#define ELF_STRUCT_SIZE(__s)
Definition elf_helpers.h:77
#define ELF_GEN_FIELD_GET_SET(__s, __field, __type)
Definition elf_helpers.h:33
static u8 fw_elf_get_class(u32 elf_fw_addr)
Definition elf_helpers.h:18
static void elf_hdr_init_ident(struct elf32_hdr *hdr, u8 class)
Definition elf_helpers.h:24
unsigned int u32
Definition types.h:39
unsigned short u16
Definition types.h:36
unsigned long long u64
Definition types.h:42
unsigned char u8
Definition types.h:33
Definition elf.h:206
Elf32_Half e_type
Definition elf.h:208
unsigned char e_ident[EI_NIDENT]
Definition elf.h:207
Elf32_Half e_ehsize
Definition elf.h:215
Elf32_Word e_version
Definition elf.h:210
Elf32_Half e_phentsize
Definition elf.h:216
Elf32_Off e_phoff
Definition elf.h:212
Elf32_Half e_shentsize
Definition elf.h:218
Elf32_Half e_shnum
Definition elf.h:219
Elf32_Half e_machine
Definition elf.h:209
Elf32_Half e_phnum
Definition elf.h:217
Elf32_Addr e_entry
Definition elf.h:211
Elf32_Half e_shstrndx
Definition elf.h:220
Elf32_Off e_shoff
Definition elf.h:213