/// <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(); }
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); }
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); }
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); }
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); }