#pragma once #include "util/types.hpp" #include "util/File.h" #include "rx/EnumBitSet.hpp" #include "util/endian.hpp" #include enum class elf_os : u8 { none = 0, lv2 = 0x66, }; enum class elf_type : u16 { none = 0, rel = 1, exec = 2, dyn = 3, core = 4, prx = 0xffa4, psv1 = 0xfe00, // ET_SCE_EXEC psv2 = 0xfe04, // ET_SCE_RELEXEC (vitasdk) }; enum class elf_machine : u16 { ppc64 = 0x15, spu = 0x17, arm = 0x28, mips = 0x08, }; enum class sec_type : u32 { sht_null = 0, sht_progbits = 1, sht_symtab = 2, sht_strtab = 3, sht_rela = 4, sht_hash = 5, sht_dynamic = 6, sht_note = 7, sht_nobits = 8, sht_rel = 9, }; enum class sh_flag : u32 { shf_write, shf_alloc, shf_execinstr, bitset_last = shf_execinstr, }; constexpr bool is_memorizable_section(sec_type type, rx::EnumBitSet flags) { switch (type) { case sec_type::sht_null: case sec_type::sht_nobits: { return false; } case sec_type::sht_progbits: { return flags.all_of(sh_flag::shf_alloc); } default: { if (type > sec_type::sht_rel) { return false; } return true; } } } template using elf_be = be_t; template using elf_le = le_t; template