Exemple #1
0
 /// <summary>
 /// Initializes a new instance of the <see cref="Section"/> class.
 /// </summary>
 /// <param name="kind">The kind of the section.</param>
 /// <param name="name">The name.</param>
 /// <param name="virtualAddress">The virtualAddress.</param>
 public Section(SectionKind kind, string name, IntPtr virtualAddress)
     : base(kind, name, virtualAddress)
 {
     header = new SectionHeader();
     header.Name = StringTableSection.AddString(name);
     stream = new MemoryStream();
 }
Exemple #2
0
        private static void WriteNullHeaderSection(EndianAwareBinaryWriter writer)
        {
            var nullsection = new SectionHeader();

            nullsection.Name             = 0;
            nullsection.Type             = SectionType.Null;
            nullsection.Flags            = 0;
            nullsection.Address          = 0;
            nullsection.Offset           = 0;
            nullsection.Size             = 0;
            nullsection.Link             = 0;
            nullsection.Info             = 0;
            nullsection.AddressAlignment = 0;
            nullsection.EntrySize        = 0;
            nullsection.Write(writer);
        }
Exemple #3
0
        private void WriteSectionHeaders(EndianAwareBinaryWriter writer)
        {
            writer.Position = elfheader.SectionHeaderOffset;

            WriteNullHeaderSection(writer);

            foreach (var section in Sections)
            {
                if (section.Size == 0 && section.SectionKind != SectionKind.BSS)
                {
                    continue;
                }

                var sheader = new SectionHeader();

                sheader.Name = AddToStringTable(section.Name);

                switch (section.SectionKind)
                {
                case SectionKind.Text: sheader.Type = SectionType.ProgBits; sheader.Flags = SectionAttribute.AllocExecute; break;

                case SectionKind.Data: sheader.Type = SectionType.ProgBits; sheader.Flags = SectionAttribute.Alloc | SectionAttribute.Write; break;

                case SectionKind.ROData: sheader.Type = SectionType.ProgBits; sheader.Flags = SectionAttribute.Alloc; break;

                case SectionKind.BSS: sheader.Type = SectionType.NoBits; sheader.Flags = SectionAttribute.Alloc | SectionAttribute.Write; break;
                }

                sheader.Address          = (uint)section.VirtualAddress;
                sheader.Offset           = section.FileOffset;
                sheader.Size             = section.AlignedSize;
                sheader.Link             = 0;
                sheader.Info             = 0;
                sheader.AddressAlignment = 0;
                sheader.EntrySize        = 0;
                sheader.Write(writer);
            }

            WriteStringHeaderSection(writer);
        }
Exemple #4
0
 private static void WriteNullHeaderSection(EndianAwareBinaryWriter writer)
 {
     var nullsection = new SectionHeader();
     nullsection.Name = 0;
     nullsection.Type = SectionType.Null;
     nullsection.Flags = 0;
     nullsection.Address = 0;
     nullsection.Offset = 0;
     nullsection.Size = 0;
     nullsection.Link = 0;
     nullsection.Info = 0;
     nullsection.AddressAlignment = 0;
     nullsection.EntrySize = 0;
     nullsection.Write(writer);
 }
Exemple #5
0
        private void WriteSectionHeaders(EndianAwareBinaryWriter writer)
        {
            writer.Position = elfheader.SectionHeaderOffset;

            WriteNullHeaderSection(writer);

            foreach (var section in Sections)
            {
                if (section.Size == 0 && section.SectionKind != SectionKind.BSS)
                    continue;

                var sheader = new SectionHeader();

                sheader.Name = AddToStringTable(section.Name);

                switch (section.SectionKind)
                {
                    case SectionKind.Text: sheader.Type = SectionType.ProgBits; sheader.Flags = SectionAttribute.AllocExecute; break;
                    case SectionKind.Data: sheader.Type = SectionType.ProgBits; sheader.Flags = SectionAttribute.Alloc | SectionAttribute.Write; break;
                    case SectionKind.ROData: sheader.Type = SectionType.ProgBits; sheader.Flags = SectionAttribute.Alloc; break;
                    case SectionKind.BSS: sheader.Type = SectionType.NoBits; sheader.Flags = SectionAttribute.Alloc | SectionAttribute.Write; break;
                }

                sheader.Address = (uint)section.VirtualAddress;
                sheader.Offset = section.FileOffset;
                sheader.Size = section.AlignedSize;
                sheader.Link = 0;
                sheader.Info = 0;
                sheader.AddressAlignment = section.SectionAlignment;
                sheader.EntrySize = 0;
                sheader.Write(writer);
            }

            WriteStringHeaderSection(writer);
        }