#pragma once #include #define ET_NONE 0 #define ET_REL 1 #define ET_EXEC 2 #define ET_DYN 3 #define ET_CORE 4 #define PT_NULL 0 #define PT_LOAD 1 #define PT_DYNAMIC 2 #define PT_INTERP 3 #define PT_NOTE 4 #define PT_SHLIB 5 #define PT_PHDR 6 #define PT_TLS 7 #define SHT_NULL 0 #define SHT_PROGBITS 1 #define SHT_SYMTAB 2 #define SHT_STRTAB 3 #define SHT_RELA 4 #define SHT_HASH 5 #define SHT_DYNAMIC 6 #define SHT_NOTE 7 #define SHT_NOBITS 8 #define SHT_REL 9 #define SHT_SHLIB 10 #define SHT_DYNSYM 11 #define SHT_INIT_ARRAY 14 #define SHT_FINI_ARRAY 15 #define SHT_PREINIT_ARRAY 16 #define SHT_GROUP 17 #define SHT_SYMTAB_SHNDX 18 struct [[gnu::packed]] Elf64_Ehdr { c8 e_ident[16]; u16 e_type; u16 e_machine; u32 e_version; u64 e_entry; u64 e_phoff; u64 e_shoff; u32 e_flags; u16 e_ehsize; u16 e_phentsize; u16 e_phnum; u16 e_shentsize; u16 e_shnum; u16 e_shstrndx; }; struct [[gnu::packed]] Elf64_Phdr { u32 p_type; u32 p_flags; u64 p_offset; u64 p_vaddr; u64 p_paddr; u64 p_filesz; u64 p_memsz; u64 p_align; }; struct [[gnu::packed]] Elf64_Shdr { u32 sh_name; u32 sh_type; u64 sh_flags; u64 sh_addr; u64 sh_offset; u64 sh_size; u32 sh_link; u32 sh_info; u64 sh_addralign; u64 sh_entsize; }; #define ELF64_R_SYM(info) ((info)>>32); #define ELF64_R_TYPE(info) ((u32)info) #define ELF64_R_AMD64_NONE 0 #define ELF64_R_AMD64_64 1 #define ELF64_R_AMD64_PC32 2 #define ELF64_R_AMD64_GOT32 3 #define ELF64_R_AMD64_PLT32 4 #define ELF64_R_AMD64_COPY 5 #define ELF64_R_AMD64_GLOB_DAT 6 #define ELF64_R_AMD64_JUMP_SLOT 7 #define ELF64_R_AMD64_RELATIVE 8 #define ELF64_R_AMD64_GOTPCREL 9 #define ELF64_R_AMD64_32 10 #define ELF64_R_AMD64_32S 11 #define ELF64_R_AMD64_16 12 #define ELF64_R_AMD64_PC16 13 #define ELF64_R_AMD64_8 14 #define ELF64_R_AMD64_PC8 15 #define ELF64_R_AMD64_PC64 24 #define ELF64_R_AMD64_GOTOFF64 25 #define ELF64_R_AMD64_GOTPC32 26 #define ELF64_R_AMD64_SIZE32 32 #define ELF64_R_AMD64_SIZE64 33 struct [[gnu::packed]] Elf64_Rela { u64 r_offset; u64 r_info; s64 r_addend; }; struct [[gnu::packed]] Elf64_Sym { u32 st_name; u8 st_info; u8 st_other; u16 st_shndx; u64 st_value; u64 st_size; };