struct elf { struct { u8 ei_magic[4] | matches('\x7fELF') str; enum { CLASS_32 = 1, CLASS_64 } u8 ei_class hex; // word size enum { ENDIANESS_LE = 1, ENDIANESS_BE } u8 ei_data hex; // endianess u8 ei_version; u8 ei_osabi; u8 ei_abi_version; u8 padding[7] nul; } header; struct body { u16 e_type hex; u16 e_machine hex; u32 e_version; select (header.ei_class) { header.CLASS_32) struct { u32 e_entry hex; u32 e_phoff; u32 e_shoff; } elf32; header.CLASS_64) struct { u64 e_entry hex; u64 e_phoff; u64 e_shoff; } elf64; } arch; u32 e_flags hex; u16 e_ehsz; u16 e_phentsize; u16 e_phnum; u16 e_shentsize; u16 e_shnum; u16 e_shstrndx; }; select (header.ei_class) { 1) struct body le | endianess('le'); 2) struct body be | endianess('be'); } body; };