private void WriteProgramHeaders() { elfheader.ProgramHeaderOffset = ElfHeader.GetEntrySize(linkerFormatType); writer.Position = elfheader.ProgramHeaderOffset; elfheader.ProgramHeaderNumber = 0; foreach (var section in linker.LinkerSections) { if (section.Size == 0 && section.SectionKind != SectionKind.BSS) { continue; } var programHeader = new ProgramHeader { Alignment = section.SectionAlignment, FileSize = section.AlignedSize, MemorySize = section.AlignedSize, Offset = section.FileOffset, VirtualAddress = section.VirtualAddress, PhysicalAddress = section.VirtualAddress, Type = ProgramHeaderType.Load, Flags = (section.SectionKind == SectionKind.Text) ? ProgramHeaderFlags.Read | ProgramHeaderFlags.Execute : (section.SectionKind == SectionKind.ROData) ? ProgramHeaderFlags.Read : ProgramHeaderFlags.Read | ProgramHeaderFlags.Write }; programHeader.Write(linkerFormatType, writer); elfheader.ProgramHeaderNumber++; } }
private void WriteSectionHeaders() { elfheader.SectionHeaderOffset = elfheader.ProgramHeaderOffset + (ProgramHeader.GetEntrySize(linkerFormatType) * elfheader.ProgramHeaderNumber); writer.Position = elfheader.SectionHeaderOffset; foreach (var section in sections) { section.WriteSectionHeader(linkerFormatType, writer); } }