diff options
| author | Ada Christine <adachristine18@gmail.com> | 2021-12-19 01:16:51 +0000 |
|---|---|---|
| committer | Ada Christine <adachristine18@gmail.com> | 2021-12-19 01:16:51 +0000 |
| commit | bff63a4337eb3388617d230970c5eb2684d6a215 (patch) | |
| tree | f40891f45918b23dac0f31888142136434c7fc8c /lib/elf.c | |
| parent | d5f485a4f6801f58cbb2bc9d8e80c955c79ff044 (diff) | |
i don't know what i'm doing anymore
Diffstat (limited to 'lib/elf.c')
| -rw-r--r-- | lib/elf.c | 106 |
1 files changed, 0 insertions, 106 deletions
diff --git a/lib/elf.c b/lib/elf.c deleted file mode 100644 index 551a5a5..0000000 --- a/lib/elf.c +++ /dev/null @@ -1,106 +0,0 @@ -#include "elf.h" - -bool elf64_validate(Elf64_Ehdr *ehdr, unsigned type, unsigned machine) -{ - if (ehdr->e_ident[EI_MAG0] != ELFMAG0 || - ehdr->e_ident[EI_MAG1] != ELFMAG1 || - ehdr->e_ident[EI_MAG2] != ELFMAG2 || - ehdr->e_ident[EI_MAG3] != ELFMAG3 || - ehdr->e_ident[EI_CLASS] != ELFCLASS64 || - ehdr->e_ident[EI_DATA] != ELFDATA2LSB || - ehdr->e_ident[EI_VERSION] != EV_CURRENT || - ehdr->e_machine != machine || - ehdr->e_type != type) - { - return false; - } - - return true; -} - -size_t elf64_size(Elf64_Ehdr *ehdr, Elf64_Phdr *phdrs) -{ - size_t size = 0; - - for (int i = 0; i < ehdr->e_phnum; i++) - { - if (phdrs[i].p_type != PT_LOAD) - { - continue; - } - - if (phdrs[i].p_paddr + phdrs[i].p_memsz > size) - { - size = phdrs[i].p_paddr + phdrs[i].p_memsz; - if (phdrs[i].p_align > 1) - { - size = (size + phdrs[i].p_align - 1) & - ~(phdrs[i].p_align - 1); - } - } - } - - return size; -} - -void elf64_reloc(Elf64_Ehdr *ehdr) -{ - // locate the dynamic segment - Elf64_Phdr *phdrs = (Elf64_Phdr *)(ehdr->e_phoff + (uintptr_t)ehdr); - Elf64_Dyn *dyn = NULL; - Elf64_Rela *rela = NULL; - size_t rela_size; - int rela_count; - - for (int i = 0; i < ehdr->e_phnum; i++) - { - if (phdrs[i].p_type != PT_DYNAMIC) continue; - - dyn = (Elf64_Dyn *)(phdrs[i].p_offset + (uintptr_t)ehdr); - } - - // parse the dynamic segment - while (dyn->d_tag != DT_NULL) - { - switch (dyn->d_tag) - { - case DT_RELA: - rela = (Elf64_Rela *)(dyn->d_ptr + (uintptr_t)ehdr); - break; - case DT_RELASZ: - rela_size = dyn->d_val; - break; - case DT_RELAENT: - rela_count = rela_size / dyn->d_val; - break; - default: - break; - } - dyn++; - } - - // perform the actual relocations - - for (int i; i < rela_count; i++) - { - union - { - Elf_Byte word8; - Elf64_Half word16; - Elf64_Word word32; - Elf64_Xword word64; - } - *reloc_ptr = NULL; - - switch (ELF64_R_TYPE(rela[i].r_info)) - { - case R_AMD64_RELATIVE: - reloc_ptr = (void *)(rela[i].r_offset + (uintptr_t)ehdr); - reloc_ptr->word64 = (rela[i].r_addend + (uintptr_t)ehdr); - break; - default: - break; - } - } -} - |
