:: limine / common / lib / elf.h 2.3 KB raw

1
#ifndef LIB__ELF_H__
2
#define LIB__ELF_H__
3
4
#include <stdint.h>
5
#include <stdbool.h>
6
#include <lib/elsewhere.h>
7
#include <lib/misc.h>
8
9
#define FIXED_HIGHER_HALF_OFFSET_64 ((uint64_t)0xffffffff80000000)
10
11
#define ELF_PF_X 1
12
#define ELF_PF_W 2
13
#define ELF_PF_R 4
14
15
struct elf_section_hdr_info {
16
    uint32_t section_entry_size;
17
    uint32_t str_section_idx;
18
    uint32_t num;
19
    uint64_t section_offset;
20
};
21
22
int elf_bits(uint8_t *elf, size_t file_size);
23
24
struct elf_section_hdr_info elf64_section_hdr_info(uint8_t *elf, size_t file_size);
25
struct elf_section_hdr_info elf32_section_hdr_info(uint8_t *elf, size_t file_size);
26
27
bool elf64_load_section(uint8_t *elf, size_t file_size, void *buffer, const char *name, size_t limit, uint64_t slide);
28
bool elf64_load(uint8_t *elf, size_t file_size, uint64_t *entry_point, uint64_t *_slide, uint32_t alloc_type, bool kaslr, struct mem_range **ranges, uint64_t *ranges_count, uint64_t *physical_base, uint64_t *virtual_base, uint64_t *image_size, uint64_t *image_size_before_bss, bool *is_reloc);
29
30
bool elf32_load_elsewhere(uint8_t *elf, size_t file_size, uint64_t *entry_point,
31
                          struct elsewhere_range **ranges);
32
bool elf64_load_elsewhere(uint8_t *elf, size_t file_size, uint64_t *entry_point,
33
                          struct elsewhere_range **ranges);
34
35
struct elf64_hdr {
36
    uint8_t  ident[16];
37
    uint16_t type;
38
    uint16_t machine;
39
    uint32_t version;
40
    uint64_t entry;
41
    uint64_t phoff;
42
    uint64_t shoff;
43
    uint32_t flags;
44
    uint16_t hdr_size;
45
    uint16_t phdr_size;
46
    uint16_t ph_num;
47
    uint16_t shdr_size;
48
    uint16_t sh_num;
49
    uint16_t shstrndx;
50
};
51
52
struct elf64_shdr {
53
    uint32_t sh_name;
54
    uint32_t sh_type;
55
    uint64_t sh_flags;
56
    uint64_t sh_addr;
57
    uint64_t sh_offset;
58
    uint64_t sh_size;
59
    uint32_t sh_link;
60
    uint32_t sh_info;
61
    uint64_t sh_addralign;
62
    uint64_t sh_entsize;
63
};
64
65
struct elf32_shdr {
66
    uint32_t sh_name;
67
    uint32_t sh_type;
68
    uint32_t sh_flags;
69
    uint32_t sh_addr;
70
    uint32_t sh_offset;
71
    uint32_t sh_size;
72
    uint32_t sh_link;
73
    uint32_t sh_info;
74
    uint32_t sh_addralign;
75
    uint32_t sh_entsize;
76
};
77
78
struct elf64_sym {
79
    uint32_t st_name;
80
    uint8_t  st_info;
81
    uint8_t  st_other;
82
    uint16_t st_shndx;
83
    uint64_t st_value;
84
    uint64_t st_size;
85
};
86
87
#endif
tab: 248 wrap: offon