diff options
-rw-r--r-- | tnslc/src/compile/format/elf.tnsl | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/tnslc/src/compile/format/elf.tnsl b/tnslc/src/compile/format/elf.tnsl index e69de29..8490180 100644 --- a/tnslc/src/compile/format/elf.tnsl +++ b/tnslc/src/compile/format/elf.tnsl @@ -0,0 +1,151 @@ +/## + Copyright 2021 Kyle Gunger + + This file is licensed under the CDDL 1.0 (the License) + and may only be used in accordance with the License. + You should have received a copy of the License with this + software/source code. If you did not, a copy can be found + at the following URL: + + https://opensource.org/licenses/CDDL-1.0 + + THIS SOFTWARE/SOURCE CODE IS PROVIDED "AS IS" WITH NO + WARRANTY, GUARANTEE, OR CLAIM OF FITNESS FOR ANY PURPOSE + EXPRESS OR IMPLIED +#/ + +# Constants and values used in ELF files + +# File signature +;const {4}uint8 SIGNATURE_ELF = {0x7F, 'E', 'L', 'F'} + +# ELF version always 1 +;const uint8 VERSION_ELF = 1 + +# OS identifiers (from wikipedia) +;enum ABI_ELF [uint8] { + SystemV = 0x0, + HP_UX = 0x1, + NetBSD = 0x2, + Linux = 0x3, + GNUHurd = 0x4, + Solaris = 0x6, + AIX = 0x7, + IRIX = 0x8, + FreeBSD = 0x9, + Tru64 = 0xA, + OpenBSD = 0xC, + OpenVMS = 0xD +} + +# ELF file types (from wikipedia) +;enum TYPE_ELF [uint16] { + ET_NONE = 0x0, + ET_REL = 0x1, + ET_EXEC = 0x2, + ET_DYN = 0x3, + ET_CORE = 0x4, + ET_LOOS = 0xFE00, + ET_HIOS = 0xFEFF, + ET_LOPROC = 0xFF00, + ET_HIPROC = 0xFFFF +} + +# ISA (from wikipedia) +;enum ARCH_ELF [uint16] { + NONE = 0x0, + SPARC = 0x2, + x86_32 = 0x3, + MIPS = 0x8, + PowerPC = 0x14, + PowerPC64 = 0x15, + ARM = 0x28, + SPARC9 = 0x2B, + IA_64 = 0x32, + x86_64 = 0x3E, + ARM64 = 0xB7, + RISC_V = 0xF3 +} + +# Some zeros to fill out the pad in the header +;const {7}uint8 PAD_ZEROS_ELF = {0, 0, 0, 0, 0, 0, 0} + + + +# Internal file structures + +# Identity inside header +;raw struct IdentityELF { + {4}uint8 + signature, + + uint8 + class, + data, + version, + abi, + + # Usually zero + abiVersion, + + {7}uint8 + # Filled with zeros, use PAD_ZEROS_ELF to fill out + pad +} + +# Main header (32 bit) +;raw struct HeaderELF32 { + IdentityELF + identity, + + uint16 + fileType, + arch, + + {4}uint8 + version, + entry, + programHeader, + sectionHeader, + + {4}uint8 + flags, + + uint16 + headerSize, + programHeaderSize, + programHeaderEntries, + sectionHeaderSize, + sectionHeaderEntries, + shNameIndex +} + +# Main header (64 bit) +;raw struct HeaderELF64 { + IdentityELF + identity, + + uint16 + fileType, + arch, + + {4}uint8 + version, + + {8}uint8 + entry, + programHeader, + sectionHeader, + + {4}uint8 + flags, + + uint16 + headerSize, + programHeaderSize, + programHeaderEntries, + sectionHeaderSize, + sectionHeaderEntries, + shNameIndex +} + |