Beispiel #1
0
        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}");
            }
        }
Beispiel #2
0
        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);
        }