diff options
Diffstat (limited to 'spec/elf.fspec')
-rw-r--r-- | spec/elf.fspec | 80 |
1 files changed, 45 insertions, 35 deletions
diff --git a/spec/elf.fspec b/spec/elf.fspec index 85c4fe7..2776c65 100644 --- a/spec/elf.fspec +++ b/spec/elf.fspec @@ -1,37 +1,47 @@ -enum { - CLASS_NONE, - CLASS_32, - CLASS_64 -}; - struct elf { - u8 ei_magic[4] | matches('\x7fELF') str; - u8 ei_class hex; // word size - u8 ei_data hex; // endianess - u8 ei_version; - u8 ei_osabi; - u8 ei_abi_version; - u8 padding[7] nul; - u16 e_type hex; - u16 e_machine hex; - u32 e_version; - select (ei_class) { - CLASS_32) struct { - u32 e_entry hex; - u32 e_phoff; - u32 e_shoff; - } elf32; - 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; + 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; }; |