protected static void AddMetadata(ElfFile file, InsomniaAssemblyMetadata metadata) { file.Strings.SaveString($".wasm-version::{metadata.Version}"); file.Strings.SaveString($".wasm-timestamp::{metadata.Timestamp.ToUnixTimeSeconds()}"); file.Strings.SaveString($".wasm-framework::{metadata.TargetFramework}"); file.Strings.SaveString($".other-len::{metadata.OtherMeta.Count}"); var index = 0; foreach (var(k, v) in metadata.OtherMeta) { file.Strings.SaveString($".other-{index++}::{k}\a{v}"); } }
protected internal static void WriteElf(byte[] ilCode, Stream stream, InsomniaAssemblyMetadata meta) { using var writer = new BinaryWriter(stream); var file = new ElfFile(); file.Sections.Add(new ElfSection()); AddCode(file, ilCode); AddMetadata(file, meta); var sectionsStringsIndex = file.AddStringsSection(); const int headerSize = 0x34; const int segmentsOffset = headerSize; const int segmentEntrySize = 0x20; var dataOffset = (uint)(segmentsOffset + file.Segments.Count * segmentEntrySize); var sectionsOffset = dataOffset + file.Data.Length; var header = new ElfHeader { Identification = { Magic = new[] { (char)0x7f, 'E', 'L', 'F' }, FileClass = ElfFileClass.Elf32, DataType = ElfDataType.Lsb, Version = 1, }, Type = ElfType.SharedObject, Machine = 0x0, Version = 1, Entry = 0x0, ProgramHeaderOffset = segmentsOffset, SectionHeaderOffset = (uint)sectionsOffset, Flags = 0x84, ElfHeaderSize = headerSize, ProgramHeaderEntrySize = segmentEntrySize, ProgramHeaderCount = (ushort)file.Segments.Count, SectionHeaderEntrySize = 0x28, SectionHeaderCount = (ushort)file.Sections.Count, StringSectionIndex = (ushort)sectionsStringsIndex }; writer.WriteElf32(header); foreach (var segment in file.Segments) { var cloned = segment; cloned.Offset += dataOffset; writer.WriteElf32(cloned); } writer.Write(file.Data.ToArray()); var offset = 0u; foreach (var section in file.Sections) { var cloned = section; if (section.Type != ElfSectionType.Null) { cloned.Offset += dataOffset; } if (cloned.Type == ElfSectionType.ProgBits) { offset = cloned.Offset; } writer.WriteElf32(cloned); } writer.Write((uint)ilCode.Length - 17); writer.Write(offset + 17); }