| 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 |