use zerocopy::FromBytes;
macro_rules! elf_enum {
(
$(#[$attr:meta])*
$vis:vis struct $name:ident($inner_type:ty) {
$(
$(#[doc = $doc:expr])*
$const_name:ident = $value:expr,
)*
}
) => {
#[repr(transparent)]
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, FromBytes)]
$(#[$attr])*
$vis struct $name {
inner: $inner_type,
}
impl $name {
$(
$(#[doc = $doc])*
pub const $const_name: Self = Self::from_raw($value);
)*
pub const fn from_raw(raw: $inner_type) -> Self {
Self { inner: raw }
}
pub const fn into_raw(self) -> $inner_type {
self.inner
}
pub const fn as_raw(&self) -> $inner_type {
self.inner
}
}
impl From<$name> for $inner_type {
fn from(e: $name) -> $inner_type {
e.into_raw()
}
}
};
}
#[repr(C)]
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, FromBytes)]
#[doc(alias = "Elf64_Ehdr")]
pub struct Header64 {
#[doc(alias = "EI_MAG0")]
#[doc(alias = "EI_MAG1")]
#[doc(alias = "EI_MAG2")]
#[doc(alias = "EI_MAG3")]
pub magic: Magic,
#[doc(alias = "EI_CLASS")]
pub class: Class,
#[doc(alias = "EI_DATA")]
pub encoding: Encoding,
#[doc(alias = "EI_VERSION")]
pub header_version: HeaderVersion,
#[doc(alias = "EI_OSABI")]
pub os_abi: OsAbi,
#[doc(alias = "EI_ABIVERSION")]
pub abi_version: u8,
#[doc(alias = "EI_PAD")]
pub pad: [u8; 7],
#[doc(alias = "e_type")]
pub object_type: ObjectType,
#[doc(alias = "e_machine")]
pub machine: Machine,
#[doc(alias = "e_version")]
pub version: Version,
#[doc(alias = "e_entry")]
pub entry_point: u64,
#[doc(alias = "e_phoff")]
pub program_header_offset: u64,
#[doc(alias = "e_shoff")]
pub section_header_offset: u64,
#[doc(alias = "e_flags")]
pub flags: u32,
#[doc(alias = "e_ehsize")]
pub header_size: u16,
#[doc(alias = "e_phentsize")]
pub program_header_entry_size: u16,
#[doc(alias = "e_phnum")]
pub program_header_count: u16,
#[doc(alias = "e_shentsize")]
pub section_header_entry_size: u16,
#[doc(alias = "e_shnum")]
pub section_header_count: u16,
#[doc(alias = "e_shstrndx")]
pub section_header_string_table_index: u16,
}
#[repr(transparent)]
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, FromBytes)]
pub struct Magic {
inner: [u8; 4],
}
impl Magic {
pub fn is_valid(&self) -> bool {
self.inner == [0x7f, b'E', b'L', b'F']
}
}
elf_enum! {
pub struct Class(u8) {
NONE = 0,
ELF32 = 1,
ELF64 = 2,
}
}
elf_enum! {
pub struct Encoding(u8) {
NONE = 0,
ELFDATA2LSB = 1,
ELFDATA2MSB = 2,
}
}
elf_enum! {
pub struct HeaderVersion(u8) {
NONE = 0,
CURRENT = 1,
}
}
elf_enum! {
pub struct OsAbi(u8) {
NONE = 0,
HPUX = 1,
NETBSD = 2,
GNU = 3,
LINUX = 3,
SOLARIS = 6,
AIX = 7,
IRIX = 8,
FREEBSD = 9,
TRU64 = 10,
MODESTO = 11,
OPENBSD = 12,
OPENVMS = 13,
NSK = 14,
AROS = 15,
FENIXOS = 16,
CLOUDABI = 17,
OPENVOS = 18,
}
}
elf_enum! {
pub struct ObjectType(u16) {
NONE = 0,
REL = 1,
EXEC = 2,
DYN = 3,
CORE = 4,
LOOS = 0xfe00,
HIOS = 0xfeff,
LOPROC = 0xff00,
HIPROC = 0xffff,
}
}
elf_enum! {
pub struct Machine(u16) {
NONE = 0,
M32 = 1,
SPARC = 2,
_386 = 3,
_68K = 4,
_88K = 5,
IAMCU = 6,
_860 = 7,
MIPS = 8,
S370 = 9,
MIPS_RS3_LE = 10,
PARISC = 15,
VPP500 = 17,
SPARC32PLUS = 18,
_960 = 19,
PPC = 20,
PPC64 = 21,
S390 = 22,
SPU = 23,
V800 = 36,
FR20 = 37,
RH32 = 38,
RCE = 39,
ARM = 40,
ALPHA = 41,
SH = 42,
SPARCV9 = 43,
TRICORE = 44,
ARC = 45,
H8_300 = 46,
H8_300H = 47,
H8S = 48,
H8_500 = 49,
IA_64 = 50,
MIPS_X = 51,
COLDFIRE = 52,
_68HC12 = 53,
MMA = 54,
PCP = 55,
NCPU = 56,
NDR1 = 57,
STARCORE = 58,
ME16 = 59,
ST100 = 60,
TINYJ = 61,
X86_64 = 62,
PDSP = 63,
PDP10 = 64,
PDP11 = 65,
FX66 = 66,
ST9PLUS = 67,
ST7 = 68,
_68HC16 = 69,
_68HC11 = 70,
_68HC08 = 71,
_68HC05 = 72,
SVX = 73,
ST19 = 74,
VAX = 75,
CRIS = 76,
JAVELIN = 77,
FIREPATH = 78,
ZSP = 79,
MMIX = 80,
HUANY = 81,
PRISM = 82,
AVR = 83,
FR30 = 84,
D10V = 85,
D30V = 86,
V850 = 87,
M32R = 88,
MN10300 = 89,
MN10200 = 90,
PJ = 91,
OPENRISC = 92,
ARC_COMPACT = 93,
XTENSA = 94,
VIDEOCORE = 95,
TMM_GPP = 96,
NS32K = 97,
TPC = 98,
SNP1K = 99,
ST200 = 100,
IP2K = 101,
MAX = 102,
CR = 103,
F2MC16 = 104,
MSP430 = 105,
BLACKFIN = 106,
SE_C33 = 107,
SEP = 108,
ARCA = 109,
UNICORE = 110,
EXCESS = 111,
DXP = 112,
ALTERA_NIOS2 = 113,
CRX = 114,
XGATE = 115,
C166 = 116,
M16C = 117,
DSPIC30F = 118,
CE = 119,
M32C = 120,
TSK3000 = 131,
RS08 = 132,
SHARC = 133,
ECOG2 = 134,
SCORE7 = 135,
DSP24 = 136,
VIDEOCORE3 = 137,
LATTICEMICO32 = 138,
SE_C17 = 139,
TI_C6000 = 140,
TI_C2000 = 141,
TI_C5500 = 142,
TI_ARP32 = 143,
TI_PRU = 144,
MMDSP_PLUS = 160,
CYPRESS_M8C = 161,
R32C = 162,
TRIMEDIA = 163,
QDSP6 = 164,
_8051 = 165,
STXP7X = 166,
NDS32 = 167,
ECOG1X = 168,
MAXQ30 = 169,
XIMO16 = 170,
MANIK = 171,
CRAYNV2 = 172,
RX = 173,
METAG = 174,
MCST_ELBRUS = 175,
ECOG16 = 176,
CR16 = 177,
ETPU = 178,
SLE9X = 179,
L10M = 180,
K10M = 181,
AARCH64 = 183,
AVR32 = 185,
STM8 = 186,
TILE64 = 187,
TILEPRO = 188,
MICROBLAZE = 189,
CUDA = 190,
TILEGX = 191,
CLOUDSHIELD = 192,
COREA_1ST = 193,
COREA_2ND = 194,
ARC_COMPACT2 = 195,
OPEN8 = 196,
RL78 = 197,
VIDEOCORE5 = 198,
_78KOR = 199,
_56800EX = 200,
BA1 = 201,
BA2 = 202,
XCORE = 203,
MCHP_PIC = 204,
KM32 = 210,
KMX32 = 211,
KMX16 = 212,
KMX8 = 213,
KVARC = 214,
CDP = 215,
COGE = 216,
COOL = 217,
NORC = 218,
CSR_KALIMBA = 219,
Z80 = 220,
VISIUM = 221,
FT32 = 222,
MOXIE = 223,
AMDGPU = 224,
RISCV = 243,
}
}
elf_enum! {
pub struct Version(u32) {
NONE = 0,
CURRENT = 1,
}
}