summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tnslc/src/compile/format/elf.tnsl151
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
+}
+