/* elf.h - ELF64 loader for Pactor64 */ #ifndef _ELF_H #define _ELF_H #include "pactor64.h" /* ELF magic bytes */ #define ELFMAG0 0x7F #define ELFMAG1 'E' #define ELFMAG2 'L' #define ELFMAG3 'F' #define ELFCLASS64 2 #define ELFDATA2LSB 1 #define ET_EXEC 2 #define EM_X86_64 62 #define PT_LOAD 1 #define PF_X 0x1 #define PF_W 0x2 #define PF_R 0x4 /* 64-bit ELF header */ typedef struct { uint8_t e_ident[16]; uint16_t e_type; uint16_t e_machine; uint32_t e_version; uint64_t e_entry; uint64_t e_phoff; uint64_t e_shoff; uint32_t e_flags; uint16_t e_ehsize; uint16_t e_phentsize; uint16_t e_phnum; uint16_t e_shentsize; uint16_t e_shnum; uint16_t e_shstrndx; } __attribute__((packed)) elf64_ehdr_t; /* 64-bit Program header */ typedef struct { uint32_t p_type; uint32_t p_flags; uint64_t p_offset; uint64_t p_vaddr; uint64_t p_paddr; uint64_t p_filesz; uint64_t p_memsz; uint64_t p_align; } __attribute__((packed)) elf64_phdr_t; /* ELF load result */ typedef struct { uint64_t entry; uint64_t load_base; uint64_t load_end; int valid; } elf64_load_result_t; /* Validate and load an ELF64 executable */ elf64_load_result_t elf64_load(const void *file_data, uint32_t file_size); /* Validate ELF header without loading */ int elf64_validate(const void *file_data, uint32_t file_size); /* Get entry point from ELF header */ uint64_t elf64_get_entry(const void *file_data); #endif /* _ELF_H */