| | |
| | |
| |
|
| | #pragma once |
| |
|
| | #include <array> |
| | #include <cstddef> |
| |
|
| | #include "common_types.h" |
| |
|
| | namespace Common { |
| | namespace ELF { |
| |
|
| | |
| | using Elf32_Half = u16; |
| | using Elf64_Half = u16; |
| |
|
| | |
| | using Elf32_Word = u32; |
| | using Elf32_Sword = s32; |
| | using Elf64_Word = u32; |
| | using Elf64_Sword = s32; |
| |
|
| | |
| | using Elf32_Xword = u64; |
| | using Elf32_Sxword = s64; |
| | using Elf64_Xword = u64; |
| | using Elf64_Sxword = s64; |
| |
|
| | |
| | using Elf32_Addr = u32; |
| | using Elf64_Addr = u64; |
| |
|
| | |
| | using Elf32_Off = u32; |
| | using Elf64_Off = u64; |
| |
|
| | |
| | using Elf32_Section = u16; |
| | using Elf64_Section = u16; |
| |
|
| | |
| | using Elf32_Versym = Elf32_Half; |
| | using Elf64_Versym = Elf64_Half; |
| |
|
| | constexpr size_t ElfIdentSize = 16; |
| |
|
| | |
| |
|
| | struct Elf32_Ehdr { |
| | std::array<u8, ElfIdentSize> e_ident; |
| | Elf32_Half e_type; |
| | Elf32_Half e_machine; |
| | Elf32_Word e_version; |
| | Elf32_Addr e_entry; |
| | Elf32_Off e_phoff; |
| | Elf32_Off e_shoff; |
| | Elf32_Word e_flags; |
| | Elf32_Half e_ehsize; |
| | Elf32_Half e_phentsize; |
| | Elf32_Half e_phnum; |
| | Elf32_Half e_shentsize; |
| | Elf32_Half e_shnum; |
| | Elf32_Half e_shstrndx; |
| | }; |
| |
|
| | struct Elf64_Ehdr { |
| | std::array<u8, ElfIdentSize> e_ident; |
| | Elf64_Half e_type; |
| | Elf64_Half e_machine; |
| | Elf64_Word e_version; |
| | Elf64_Addr e_entry; |
| | Elf64_Off e_phoff; |
| | Elf64_Off e_shoff; |
| | Elf64_Word e_flags; |
| | Elf64_Half e_ehsize; |
| | Elf64_Half e_phentsize; |
| | Elf64_Half e_phnum; |
| | Elf64_Half e_shentsize; |
| | Elf64_Half e_shnum; |
| | Elf64_Half e_shstrndx; |
| | }; |
| |
|
| | constexpr u8 ElfClass32 = 1; |
| | constexpr u8 ElfClass64 = 2; |
| | constexpr u8 ElfData2Lsb = 1; |
| | constexpr u8 ElfVersionCurrent = 1; |
| | constexpr u8 ElfOsAbiNone = 0; |
| |
|
| | constexpr u16 ElfTypeNone = 0; |
| | constexpr u16 ElfTypeRel = 0; |
| | constexpr u16 ElfTypeExec = 0; |
| | constexpr u16 ElfTypeDyn = 0; |
| |
|
| | constexpr u16 ElfMachineArm = 40; |
| | constexpr u16 ElfMachineAArch64 = 183; |
| |
|
| | constexpr std::array<u8, ElfIdentSize> Elf32Ident{ |
| | 0x7f, 'E', 'L', 'F', ElfClass32, ElfData2Lsb, ElfVersionCurrent, ElfOsAbiNone}; |
| |
|
| | constexpr std::array<u8, ElfIdentSize> Elf64Ident{ |
| | 0x7f, 'E', 'L', 'F', ElfClass64, ElfData2Lsb, ElfVersionCurrent, ElfOsAbiNone}; |
| |
|
| | |
| |
|
| | struct Elf32_Shdr { |
| | Elf32_Word sh_name; |
| | Elf32_Word sh_type; |
| | Elf32_Word sh_flags; |
| | Elf32_Addr sh_addr; |
| | Elf32_Off sh_offset; |
| | Elf32_Word sh_size; |
| | Elf32_Word sh_link; |
| | Elf32_Word sh_info; |
| | Elf32_Word sh_addralign; |
| | Elf32_Word sh_entsize; |
| | }; |
| |
|
| | struct Elf64_Shdr { |
| | Elf64_Word sh_name; |
| | Elf64_Word sh_type; |
| | Elf64_Xword sh_flags; |
| | Elf64_Addr sh_addr; |
| | Elf64_Off sh_offset; |
| | Elf64_Xword sh_size; |
| | Elf64_Word sh_link; |
| | Elf64_Word sh_info; |
| | Elf64_Xword sh_addralign; |
| | Elf64_Xword sh_entsize; |
| | }; |
| |
|
| | constexpr u32 ElfShnUndef = 0; |
| |
|
| | constexpr u32 ElfShtNull = 0; |
| | constexpr u32 ElfShtProgBits = 1; |
| | constexpr u32 ElfShtSymtab = 2; |
| | constexpr u32 ElfShtStrtab = 3; |
| | constexpr u32 ElfShtRela = 4; |
| | constexpr u32 ElfShtDynamic = 6; |
| | constexpr u32 ElfShtNobits = 7; |
| | constexpr u32 ElfShtRel = 9; |
| | constexpr u32 ElfShtDynsym = 11; |
| |
|
| | |
| |
|
| | struct Elf32_Sym { |
| | Elf32_Word st_name; |
| | Elf32_Addr st_value; |
| | Elf32_Word st_size; |
| | u8 st_info; |
| | u8 st_other; |
| | Elf32_Section st_shndx; |
| | }; |
| |
|
| | struct Elf64_Sym { |
| | Elf64_Word st_name; |
| | u8 st_info; |
| | u8 st_other; |
| | Elf64_Section st_shndx; |
| | Elf64_Addr st_value; |
| | Elf64_Xword st_size; |
| | }; |
| |
|
| | |
| |
|
| | static inline u8 ElfStBind(u8 st_info) { |
| | return st_info >> 4; |
| | } |
| | static inline u8 ElfStType(u8 st_info) { |
| | return st_info & 0xf; |
| | } |
| | static inline u8 ElfStInfo(u8 st_bind, u8 st_type) { |
| | return static_cast<u8>((st_bind << 4) + (st_type & 0xf)); |
| | } |
| |
|
| | constexpr u8 ElfBindLocal = 0; |
| | constexpr u8 ElfBindGlobal = 1; |
| | constexpr u8 ElfBindWeak = 2; |
| |
|
| | constexpr u8 ElfTypeUnspec = 0; |
| | constexpr u8 ElfTypeObject = 1; |
| | constexpr u8 ElfTypeFunc = 2; |
| |
|
| | static inline u8 ElfStVisibility(u8 st_other) { |
| | return static_cast<u8>(st_other & 0x3); |
| | } |
| |
|
| | constexpr u8 ElfVisibilityDefault = 0; |
| | constexpr u8 ElfVisibilityInternal = 1; |
| | constexpr u8 ElfVisibilityHidden = 2; |
| | constexpr u8 ElfVisibilityProtected = 3; |
| |
|
| | |
| |
|
| | struct Elf32_Rel { |
| | Elf32_Addr r_offset; |
| | Elf32_Word r_info; |
| | }; |
| |
|
| | |
| |
|
| | struct Elf32_Rela { |
| | Elf32_Addr r_offset; |
| | Elf32_Word r_info; |
| | Elf32_Sword r_addend; |
| | }; |
| |
|
| | struct Elf64_Rela { |
| | Elf64_Addr r_offset; |
| | Elf64_Xword r_info; |
| | Elf64_Sxword r_addend; |
| | }; |
| |
|
| | |
| |
|
| | using Elf32_Relr = Elf32_Word; |
| | using Elf64_Relr = Elf64_Xword; |
| |
|
| | |
| |
|
| | static inline u32 Elf32RelSymIndex(Elf32_Word r_info) { |
| | return r_info >> 8; |
| | } |
| | static inline u8 Elf32RelType(Elf32_Word r_info) { |
| | return static_cast<u8>(r_info & 0xff); |
| | } |
| | static inline Elf32_Word Elf32RelInfo(u32 sym_index, u8 type) { |
| | return (sym_index << 8) + type; |
| | } |
| | static inline u32 Elf64RelSymIndex(Elf64_Xword r_info) { |
| | return static_cast<u32>(r_info >> 32); |
| | } |
| | static inline u32 Elf64RelType(Elf64_Xword r_info) { |
| | return r_info & 0xffffffff; |
| | } |
| | static inline Elf64_Xword Elf64RelInfo(u32 sym_index, u32 type) { |
| | return (static_cast<Elf64_Xword>(sym_index) << 32) + type; |
| | } |
| |
|
| | constexpr u32 ElfArmCopy = 20; |
| | constexpr u32 ElfArmGlobDat = 21; |
| | constexpr u32 ElfArmJumpSlot = 22; |
| | constexpr u32 ElfArmRelative = 23; |
| |
|
| | constexpr u32 ElfAArch64Copy = 1024; |
| | constexpr u32 ElfAArch64GlobDat = 1025; |
| | constexpr u32 ElfAArch64JumpSlot = 1026; |
| | constexpr u32 ElfAArch64Relative = 1027; |
| |
|
| | |
| |
|
| | struct Elf32_Phdr { |
| | Elf32_Word p_type; |
| | Elf32_Off p_offset; |
| | Elf32_Addr p_vaddr; |
| | Elf32_Addr p_paddr; |
| | Elf32_Word p_filesz; |
| | Elf32_Word p_memsz; |
| | Elf32_Word p_flags; |
| | Elf32_Word p_align; |
| | }; |
| |
|
| | struct Elf64_Phdr { |
| | Elf64_Word p_type; |
| | Elf64_Word p_flags; |
| | Elf64_Off p_offset; |
| | Elf64_Addr p_vaddr; |
| | Elf64_Addr p_paddr; |
| | Elf64_Xword p_filesz; |
| | Elf64_Xword p_memsz; |
| | Elf64_Xword p_align; |
| | }; |
| |
|
| | |
| |
|
| | constexpr u32 ElfPtNull = 0; |
| | constexpr u32 ElfPtLoad = 1; |
| | constexpr u32 ElfPtDynamic = 2; |
| | constexpr u32 ElfPtInterp = 3; |
| | constexpr u32 ElfPtNote = 4; |
| | constexpr u32 ElfPtPhdr = 6; |
| | constexpr u32 ElfPtTls = 7; |
| |
|
| | |
| |
|
| | constexpr u32 ElfPfExec = 0; |
| | constexpr u32 ElfPfWrite = 1; |
| | constexpr u32 ElfPfRead = 2; |
| |
|
| | |
| |
|
| | struct Elf32_Dyn { |
| | Elf32_Sword d_tag; |
| | union { |
| | Elf32_Word d_val; |
| | Elf32_Addr d_ptr; |
| | } d_un; |
| | }; |
| |
|
| | struct Elf64_Dyn { |
| | Elf64_Sxword d_tag; |
| | union { |
| | Elf64_Xword d_val; |
| | Elf64_Addr d_ptr; |
| | } d_un; |
| | }; |
| |
|
| | |
| |
|
| | constexpr u32 ElfDtNull = 0; |
| | constexpr u32 ElfDtNeeded = 1; |
| | constexpr u32 ElfDtPltRelSz = 2; |
| | constexpr u32 ElfDtPltGot = 3; |
| | constexpr u32 ElfDtHash = 4; |
| | constexpr u32 ElfDtStrtab = 5; |
| | constexpr u32 ElfDtSymtab = 6; |
| | constexpr u32 ElfDtRela = 7; |
| | constexpr u32 ElfDtRelasz = 8; |
| | constexpr u32 ElfDtRelaent = 9; |
| | constexpr u32 ElfDtStrsz = 10; |
| | constexpr u32 ElfDtSyment = 11; |
| | constexpr u32 ElfDtInit = 12; |
| | constexpr u32 ElfDtFini = 13; |
| | constexpr u32 ElfDtRel = 17; |
| | constexpr u32 ElfDtRelsz = 18; |
| | constexpr u32 ElfDtRelent = 19; |
| | constexpr u32 ElfDtPltRel = 20; |
| | constexpr u32 ElfDtTextRel = 22; |
| | constexpr u32 ElfDtJmpRel = 23; |
| | constexpr u32 ElfDtBindNow = 24; |
| | constexpr u32 ElfDtInitArray = 25; |
| | constexpr u32 ElfDtFiniArray = 26; |
| | constexpr u32 ElfDtInitArraySz = 27; |
| | constexpr u32 ElfDtFiniArraySz = 28; |
| | constexpr u32 ElfDtSymtabShndx = 34; |
| | constexpr u32 ElfDtRelrsz = 35; |
| | constexpr u32 ElfDtRelr = 36; |
| | constexpr u32 ElfDtRelrent = 37; |
| |
|
| | } |
| | } |
| |
|