Example #1
0
        private unsafe void WriteSectionHeader64()
        {
            var hdr = new Elf64_Ehdr();

            ObjectFile.CopyIdentTo(new Span <byte>(hdr.e_ident, EI_NIDENT));

            _encoder.Encode(out hdr.e_type, (ushort)ObjectFile.FileType);
            _encoder.Encode(out hdr.e_machine, ObjectFile.Arch.Value);
            _encoder.Encode(out hdr.e_version, EV_CURRENT);
            _encoder.Encode(out hdr.e_entry, ObjectFile.EntryPointAddress);
            _encoder.Encode(out hdr.e_ehsize, Layout.SizeOfElfHeader);
            _encoder.Encode(out hdr.e_flags, (uint)ObjectFile.Flags);

            // program headers
            _encoder.Encode(out hdr.e_phoff, Layout.OffsetOfProgramHeaderTable);
            _encoder.Encode(out hdr.e_phentsize, Layout.SizeOfProgramHeaderEntry);
            _encoder.Encode(out hdr.e_phnum, (ushort)ObjectFile.Segments.Count);

            // entries for sections
            _encoder.Encode(out hdr.e_shoff, Layout.OffsetOfSectionHeaderTable);
            _encoder.Encode(out hdr.e_shentsize, (ushort)sizeof(Elf64_Shdr));
            _encoder.Encode(out hdr.e_shnum, (ushort)ObjectFile.VisibleSectionCount);
            _encoder.Encode(out hdr.e_shstrndx, (ushort)(ObjectFile.SectionHeaderStringTable?.SectionIndex ?? (ushort)0));

            Write(hdr);
        }