/// <summary> /// Creates the elf32 file. /// </summary> /// <param name="compiler">The compiler.</param> private void CreateElf64File(Mosa.Runtime.CompilerFramework.AssemblyCompiler compiler) { using (System.IO.FileStream fs = new System.IO.FileStream(this.OutputFile, System.IO.FileMode.Create, System.IO.FileAccess.Write, System.IO.FileShare.None)) { Elf64Header header = new Elf64Header(); header.Type = Elf64FileType.Executable; header.Machine = Elf64MachineType.Intel386; header.SectionHeaderNumber = (ushort)(Sections.Count + 2); header.SectionHeaderOffset = header.ElfHeaderSize; header.CreateIdent(Elf64IdentClass.Class64, Elf64IdentData.Data2LSB, null); // Calculate the concatenated size of all section's data uint offset = 0; foreach (Mosa.Runtime.Linker.Elf64.Sections.Elf64Section section in Sections) { offset += (uint)section.Length; } offset += (uint)nullSection.Length; offset += (uint)stringTableSection.Length; // Calculate offsets header.ProgramHeaderOffset = (uint)header.ElfHeaderSize + (uint)header.SectionHeaderEntrySize * (uint)header.SectionHeaderNumber + offset; header.SectionHeaderStringIndex = (ushort)((ushort)header.ProgramHeaderOffset + (ushort)header.ProgramHeaderNumber * (ushort)header.ProgramHeaderEntrySize); System.IO.BinaryWriter writer = new System.IO.BinaryWriter(fs); // Write the ELF Header header.Write(writer); // Overjump the Section Header Table and write the section's data first long tmp = fs.Position; writer.Seek((int)(tmp + header.SectionHeaderNumber * header.SectionHeaderEntrySize), System.IO.SeekOrigin.Begin); nullSection.Write(writer); stringTableSection.Write(writer); // Write the sections foreach (Mosa.Runtime.Linker.Elf64.Sections.Elf64Section section in Sections) { section.Write(writer); } // Jump back to the Section Header Table writer.Seek((int)tmp, System.IO.SeekOrigin.Begin); nullSection.WriteHeader(writer); stringTableSection.WriteHeader(writer); // Write the section headers foreach (Mosa.Runtime.Linker.Elf64.Sections.Elf64Section section in Sections) { section.WriteHeader(writer); } } }
/// <summary> /// Creates the elf32 file. /// </summary> /// <param name="compiler">The compiler.</param> private void CreateElf64File(Mosa.Runtime.CompilerFramework.AssemblyCompiler compiler) { using (System.IO.FileStream fs = new System.IO.FileStream(this.OutputFile, System.IO.FileMode.Create, System.IO.FileAccess.Write, System.IO.FileShare.None)) { Elf64Header header = new Elf64Header(); header.Type = Elf64FileType.Executable; header.Machine = Elf64MachineType.Intel386; header.SectionHeaderNumber = (ushort)(Sections.Count + 2); header.SectionHeaderOffset = header.ElfHeaderSize; header.CreateIdent(Elf64IdentClass.Class64, Elf64IdentData.Data2LSB, null); // Calculate the concatenated size of all section's data uint offset = 0; foreach (Mosa.Runtime.Linker.Elf64.Sections.Elf64Section section in Sections) { offset += (uint)section.Length; } offset += (uint)nullSection.Length; offset += (uint)stringTableSection.Length; // Calculate offsets header.ProgramHeaderOffset = (uint)header.ElfHeaderSize + (uint)header.SectionHeaderEntrySize * (uint)header.SectionHeaderNumber + offset; header.SectionHeaderStringIndex = (ushort)((ushort)header.ProgramHeaderOffset + (ushort)header.ProgramHeaderNumber * (ushort)header.ProgramHeaderEntrySize); System.IO.BinaryWriter writer = new System.IO.BinaryWriter(fs); // Write the ELF Header header.Write(writer); // Overjump the Section Header Table and write the section's data first long tmp = fs.Position; writer.Seek((int)(tmp + header.SectionHeaderNumber * header.SectionHeaderEntrySize), System.IO.SeekOrigin.Begin); nullSection.Write(writer); stringTableSection.Write(writer); // Write the sections foreach (Mosa.Runtime.Linker.Elf64.Sections.Elf64Section section in Sections) section.Write(writer); // Jump back to the Section Header Table writer.Seek((int)tmp, System.IO.SeekOrigin.Begin); nullSection.WriteHeader(writer); stringTableSection.WriteHeader(writer); // Write the section headers foreach (Mosa.Runtime.Linker.Elf64.Sections.Elf64Section section in Sections) section.WriteHeader(writer); } }