summaryrefslogtreecommitdiff
path: root/spec/elf.fspec
diff options
context:
space:
mode:
Diffstat (limited to 'spec/elf.fspec')
-rw-r--r--spec/elf.fspec80
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;
};