private static void InitElf() { LinkerScript elf32_def = new LinkerScript("elf"); elf32_def.Script.Add(new LinkerScript.EntryPoint("main")); elf32_def.Script.Add(new LinkerScript.UpdateOffset(LinkerScript.UpdateOffset.UpdateType.Set, Program.options["text-start-addr"].ULong)); elf32_def.Script.Add(new LinkerScript.DefineSymbol("__begin")); elf32_def.Script.Add(new LinkerScript.DefineSymbol("__text")); elf32_def.Script.Add(new LinkerScript.DefineSection(LinkerScript.DefineSection.StandardSection.Text)); elf32_def.Script.Add(new LinkerScript.InputFileSection(".text*")); elf32_def.Script.Add(new LinkerScript.EndSection()); if (Program.options["data-start-addr"].Set) { elf32_def.Script.Add(new LinkerScript.UpdateOffset(LinkerScript.UpdateOffset.UpdateType.Set, Program.options["data-start-addr"].ULong)); } else { elf32_def.Script.Add(new LinkerScript.UpdateOffset(LinkerScript.UpdateOffset.UpdateType.Align, Program.options["page-size"].ULong)); } elf32_def.Script.Add(new LinkerScript.DefineSymbol("__data")); elf32_def.Script.Add(new LinkerScript.DefineSection(LinkerScript.DefineSection.StandardSection.Data)); elf32_def.Script.Add(new LinkerScript.InputFileSection(".data*")); elf32_def.Script.Add(new LinkerScript.EndSection()); if (Program.options["rodata-start-addr"].Set) { elf32_def.Script.Add(new LinkerScript.UpdateOffset(LinkerScript.UpdateOffset.UpdateType.Set, Program.options["rodata-start-addr"].ULong)); } else { elf32_def.Script.Add(new LinkerScript.UpdateOffset(LinkerScript.UpdateOffset.UpdateType.Align, Program.options["page-size"].ULong)); } elf32_def.Script.Add(new LinkerScript.DefineSymbol("__rodata")); elf32_def.Script.Add(new LinkerScript.DefineSection(LinkerScript.DefineSection.StandardSection.Rodata)); elf32_def.Script.Add(new LinkerScript.InputFileSection(".rodata*")); elf32_def.Script.Add(new LinkerScript.EndSection()); if (Program.options["bss-start-addr"].Set) { elf32_def.Script.Add(new LinkerScript.UpdateOffset(LinkerScript.UpdateOffset.UpdateType.Set, Program.options["bss-start-addr"].ULong)); } else { elf32_def.Script.Add(new LinkerScript.UpdateOffset(LinkerScript.UpdateOffset.UpdateType.Align, Program.options["page-size"].ULong)); } elf32_def.Script.Add(new LinkerScript.DefineSymbol("__bss")); elf32_def.Script.Add(new LinkerScript.DefineSection(LinkerScript.DefineSection.StandardSection.Bss)); elf32_def.Script.Add(new LinkerScript.InputFileSection(".bss*")); elf32_def.Script.Add(new LinkerScript.EndSection()); elf32_def.Script.Add(new LinkerScript.DefineSymbol("__end")); Scripts["elf"] = elf32_def; Scripts["elf64"] = elf32_def; }
private static void InitElfTyKObj() { // TyKObj is a relocatable format for the tysos kernel containing a elf hash and a text address of 0x40000000 LinkerScript elf32_tykobj = new LinkerScript("elf-tykobj"); elf32_tykobj.Script.Add(new LinkerScript.SetExecutable(false)); elf32_tykobj.Script.Add(new LinkerScript.GenerateELFHash()); elf32_tykobj.Script.Add(new LinkerScript.UpdateOffset(LinkerScript.UpdateOffset.UpdateType.Set, 0x40000000)); elf32_tykobj.Script.Add(new LinkerScript.DefineSection(LinkerScript.DefineSection.StandardSection.Text)); elf32_tykobj.Script.Add(new LinkerScript.DefineSymbol("__text")); elf32_tykobj.Script.Add(new LinkerScript.InputFileSection(".text*")); elf32_tykobj.Script.Add(new LinkerScript.EndSection()); elf32_tykobj.Script.Add(new LinkerScript.UpdateOffset(LinkerScript.UpdateOffset.UpdateType.Align, 16)); elf32_tykobj.Script.Add(new LinkerScript.DefineSection(LinkerScript.DefineSection.StandardSection.Data)); elf32_tykobj.Script.Add(new LinkerScript.DefineSymbol("__data")); elf32_tykobj.Script.Add(new LinkerScript.InputFileSection(".data*")); elf32_tykobj.Script.Add(new LinkerScript.EndSection()); elf32_tykobj.Script.Add(new LinkerScript.UpdateOffset(LinkerScript.UpdateOffset.UpdateType.Align, 16)); elf32_tykobj.Script.Add(new LinkerScript.DefineSection(LinkerScript.DefineSection.StandardSection.Rodata)); elf32_tykobj.Script.Add(new LinkerScript.DefineSymbol("__rodata")); elf32_tykobj.Script.Add(new LinkerScript.InputFileSection(".rodata*")); elf32_tykobj.Script.Add(new LinkerScript.EndSection()); elf32_tykobj.Script.Add(new LinkerScript.UpdateOffset(LinkerScript.UpdateOffset.UpdateType.Align, 16)); elf32_tykobj.Script.Add(new LinkerScript.DefineSection(LinkerScript.DefineSection.StandardSection.Bss)); elf32_tykobj.Script.Add(new LinkerScript.DefineSymbol("__bss")); elf32_tykobj.Script.Add(new LinkerScript.InputFileSection(".bss*")); elf32_tykobj.Script.Add(new LinkerScript.EndSection()); elf32_tykobj.Script.Add(new LinkerScript.UpdateOffset(LinkerScript.UpdateOffset.UpdateType.Set, 0)); elf32_tykobj.Script.Add(new LinkerScript.DefineSection(".comment", 0, false, false, false, true)); elf32_tykobj.Script.Add(new LinkerScript.InputFileSection(".comment*")); elf32_tykobj.Script.Add(new LinkerScript.AddComment()); elf32_tykobj.Script.Add(new LinkerScript.EndSection()); elf32_tykobj.Script.Add(new LinkerScript.UpdateOffset(LinkerScript.UpdateOffset.UpdateType.Set, 0)); elf32_tykobj.Script.Add(new LinkerScript.DefineSection(LinkerScript.DefineSection.StandardSection.ElfDynamic)); elf32_tykobj.Script.Add(new LinkerScript.DefineSymbol("_DYNAMIC")); elf32_tykobj.Script.Add(new LinkerScript.ElfDynamicSection()); elf32_tykobj.Script.Add(new LinkerScript.EndSection()); elf32_tykobj.Script.Add(new LinkerScript.UpdateOffset(LinkerScript.UpdateOffset.UpdateType.Set, 0)); elf32_tykobj.Script.Add(new LinkerScript.DefineSection(LinkerScript.DefineSection.StandardSection.ElfHash)); elf32_tykobj.Script.Add(new LinkerScript.ElfHashSection()); elf32_tykobj.Script.Add(new LinkerScript.EndSection()); elf32_tykobj.Script.Add(new LinkerScript.GenerateELFProgramHeaders()); Scripts["elf-tykobj"] = elf32_tykobj; }
private static void InitElfJCA() { // JCA-elf-none is optimized for loading into boot roms. // Specifically: // .text starts at 0x0 // .rodata is included in .text for code size // .bss starts at 0x400000 // .data is included in .bss (and therefore initialized data // is not allowed) LinkerScript elf32_jca = new LinkerScript("elf-jca"); if (Program.options["text-start-addr"].Set) { elf32_jca.Script.Add(new LinkerScript.UpdateOffset(LinkerScript.UpdateOffset.UpdateType.Set, Program.options["text-start-addr"].ULong)); } elf32_jca.Script.Add(new LinkerScript.DefineSection(LinkerScript.DefineSection.StandardSection.Text)); elf32_jca.Script.Add(new LinkerScript.DefineSymbol("__begin")); elf32_jca.Script.Add(new LinkerScript.DefineSymbol("__text")); elf32_jca.Script.Add(new LinkerScript.InputFileSection(".text*")); elf32_jca.Script.Add(new LinkerScript.DefineSymbol("__rodata")); elf32_jca.Script.Add(new LinkerScript.InputFileSection(".rodata*")); elf32_jca.Script.Add(new LinkerScript.EndSection()); if (Program.options["bss-start-addr"].Set) { elf32_jca.Script.Add(new LinkerScript.UpdateOffset(LinkerScript.UpdateOffset.UpdateType.Set, Program.options["bss-start-addr"].ULong)); } else { elf32_jca.Script.Add(new LinkerScript.UpdateOffset(LinkerScript.UpdateOffset.UpdateType.Set, 0x800000)); } elf32_jca.Script.Add(new LinkerScript.DefineSection(LinkerScript.DefineSection.StandardSection.Bss)); elf32_jca.Script.Add(new LinkerScript.DefineSymbol("__bss")); elf32_jca.Script.Add(new LinkerScript.InputFileSection(".bss*")); elf32_jca.Script.Add(new LinkerScript.CommonSection()); elf32_jca.Script.Add(new LinkerScript.DefineSymbol("__data")); elf32_jca.Script.Add(new LinkerScript.InputFileSection(".data*")); elf32_jca.Script.Add(new LinkerScript.DefineSymbol("__end")); elf32_jca.Script.Add(new LinkerScript.EndSection()); Scripts["jca-elf-none"] = elf32_jca; }
private static void InitElfTyObj() { // TyObj is a relocatable format that will eventually contain a ELF hash of the symbol table LinkerScript elf32_tyobj = new LinkerScript("elf-tyobj"); elf32_tyobj.Script.Add(new LinkerScript.SetExecutable(false)); elf32_tyobj.Script.Add(new LinkerScript.GenerateELFHash()); elf32_tyobj.Script.Add(new LinkerScript.UpdateOffset(LinkerScript.UpdateOffset.UpdateType.Set, 0)); elf32_tyobj.Script.Add(new LinkerScript.DefineSection(LinkerScript.DefineSection.StandardSection.Text)); elf32_tyobj.Script.Add(new LinkerScript.DefineSymbol("__text")); elf32_tyobj.Script.Add(new LinkerScript.InputFileSection(".text*")); elf32_tyobj.Script.Add(new LinkerScript.EndSection()); elf32_tyobj.Script.Add(new LinkerScript.UpdateOffset(LinkerScript.UpdateOffset.UpdateType.Set, 0)); elf32_tyobj.Script.Add(new LinkerScript.DefineSection(LinkerScript.DefineSection.StandardSection.Data)); elf32_tyobj.Script.Add(new LinkerScript.DefineSymbol("__data")); elf32_tyobj.Script.Add(new LinkerScript.InputFileSection(".data*")); elf32_tyobj.Script.Add(new LinkerScript.EndSection()); elf32_tyobj.Script.Add(new LinkerScript.UpdateOffset(LinkerScript.UpdateOffset.UpdateType.Set, 0)); elf32_tyobj.Script.Add(new LinkerScript.DefineSection(LinkerScript.DefineSection.StandardSection.Rodata)); elf32_tyobj.Script.Add(new LinkerScript.DefineSymbol("__rodata")); elf32_tyobj.Script.Add(new LinkerScript.InputFileSection(".rodata*")); elf32_tyobj.Script.Add(new LinkerScript.EndSection()); elf32_tyobj.Script.Add(new LinkerScript.UpdateOffset(LinkerScript.UpdateOffset.UpdateType.Set, 0)); elf32_tyobj.Script.Add(new LinkerScript.DefineSection(LinkerScript.DefineSection.StandardSection.Bss)); elf32_tyobj.Script.Add(new LinkerScript.DefineSymbol("__bss")); elf32_tyobj.Script.Add(new LinkerScript.InputFileSection(".bss*")); elf32_tyobj.Script.Add(new LinkerScript.EndSection()); elf32_tyobj.Script.Add(new LinkerScript.UpdateOffset(LinkerScript.UpdateOffset.UpdateType.Set, 0)); elf32_tyobj.Script.Add(new LinkerScript.DefineSection(".comment", 0, false, false, false, true)); elf32_tyobj.Script.Add(new LinkerScript.InputFileSection(".comment*")); elf32_tyobj.Script.Add(new LinkerScript.AddComment()); elf32_tyobj.Script.Add(new LinkerScript.ParseComments(new EntryPointParser())); elf32_tyobj.Script.Add(new LinkerScript.EndSection()); elf32_tyobj.Script.Add(new LinkerScript.UpdateOffset(LinkerScript.UpdateOffset.UpdateType.Set, 0)); elf32_tyobj.Script.Add(new LinkerScript.DefineSection(LinkerScript.DefineSection.StandardSection.ElfDynamic)); elf32_tyobj.Script.Add(new LinkerScript.DefineSymbol("_DYNAMIC")); elf32_tyobj.Script.Add(new LinkerScript.ElfDynamicSection()); elf32_tyobj.Script.Add(new LinkerScript.EndSection()); elf32_tyobj.Script.Add(new LinkerScript.UpdateOffset(LinkerScript.UpdateOffset.UpdateType.Set, 0)); elf32_tyobj.Script.Add(new LinkerScript.DefineSection(LinkerScript.DefineSection.StandardSection.ElfHash)); elf32_tyobj.Script.Add(new LinkerScript.ElfHashSection()); elf32_tyobj.Script.Add(new LinkerScript.EndSection()); Scripts["elf-tyobj"] = elf32_tyobj; }
private static void InitElf() { LinkerScript elf32_def = new LinkerScript(); elf32_def.Script.Add(new LinkerScript.EntryPoint("main")); elf32_def.Script.Add(new LinkerScript.UpdateOffset(LinkerScript.UpdateOffset.UpdateType.Set, Program.options["text-start-addr"].ULong)); elf32_def.Script.Add(new LinkerScript.DefineSymbol("__begin")); elf32_def.Script.Add(new LinkerScript.DefineSymbol("__text")); elf32_def.Script.Add(new LinkerScript.DefineSection(LinkerScript.DefineSection.StandardSection.Text)); elf32_def.Script.Add(new LinkerScript.InputFileSection(".text*")); elf32_def.Script.Add(new LinkerScript.EndSection()); if (Program.options["data-start-addr"].Set) elf32_def.Script.Add(new LinkerScript.UpdateOffset(LinkerScript.UpdateOffset.UpdateType.Set, Program.options["data-start-addr"].ULong)); else elf32_def.Script.Add(new LinkerScript.UpdateOffset(LinkerScript.UpdateOffset.UpdateType.Align, Program.options["page-size"].ULong)); elf32_def.Script.Add(new LinkerScript.DefineSymbol("__data")); elf32_def.Script.Add(new LinkerScript.DefineSection(LinkerScript.DefineSection.StandardSection.Data)); elf32_def.Script.Add(new LinkerScript.InputFileSection(".data*")); elf32_def.Script.Add(new LinkerScript.EndSection()); if (Program.options["rodata-start-addr"].Set) elf32_def.Script.Add(new LinkerScript.UpdateOffset(LinkerScript.UpdateOffset.UpdateType.Set, Program.options["rodata-start-addr"].ULong)); else elf32_def.Script.Add(new LinkerScript.UpdateOffset(LinkerScript.UpdateOffset.UpdateType.Align, Program.options["page-size"].ULong)); elf32_def.Script.Add(new LinkerScript.DefineSymbol("__rodata")); elf32_def.Script.Add(new LinkerScript.DefineSection(LinkerScript.DefineSection.StandardSection.Rodata)); elf32_def.Script.Add(new LinkerScript.InputFileSection(".rodata*")); elf32_def.Script.Add(new LinkerScript.EndSection()); if (Program.options["bss-start-addr"].Set) elf32_def.Script.Add(new LinkerScript.UpdateOffset(LinkerScript.UpdateOffset.UpdateType.Set, Program.options["bss-start-addr"].ULong)); else elf32_def.Script.Add(new LinkerScript.UpdateOffset(LinkerScript.UpdateOffset.UpdateType.Align, Program.options["page-size"].ULong)); elf32_def.Script.Add(new LinkerScript.DefineSymbol("__bss")); elf32_def.Script.Add(new LinkerScript.DefineSection(LinkerScript.DefineSection.StandardSection.Bss)); elf32_def.Script.Add(new LinkerScript.InputFileSection(".bss*")); elf32_def.Script.Add(new LinkerScript.EndSection()); elf32_def.Script.Add(new LinkerScript.DefineSymbol("__end")); Scripts["elf"] = elf32_def; Scripts["elf64"] = elf32_def; }
private static void InitElfJCAProg() { // JCA-elf-prog is a JCA program // Specifically: // .text starts at 0x400000 // .rodata follows aligned on a 4 byte boundary // .data follows aligned on a 4 byte boundary // .bss follows aligned on a 4 byte boundary LinkerScript elf32_jca = new LinkerScript("elf-jca-prog"); if (Program.options["epoint"].Set) { elf32_jca.Script.Add(new LinkerScript.EntryPoint(Program.options["epoint"].String)); } else { elf32_jca.Script.Add(new LinkerScript.EntryPoint("_start")); } if (!Program.options["nostartfiles"].Set) { elf32_jca.Script.Add(new LinkerScript.AddInputFile("crt0.o")); } if (Program.options["text-start-addr"].Set) { elf32_jca.Script.Add(new LinkerScript.UpdateOffset(LinkerScript.UpdateOffset.UpdateType.Set, Program.options["text-start-addr"].ULong)); } else { elf32_jca.Script.Add(new LinkerScript.UpdateOffset(LinkerScript.UpdateOffset.UpdateType.Set, 0x400000)); } elf32_jca.Script.Add(new LinkerScript.DefineSection(LinkerScript.DefineSection.StandardSection.Text)); elf32_jca.Script.Add(new LinkerScript.DefineSymbol("__begin")); elf32_jca.Script.Add(new LinkerScript.DefineSymbol("__text")); elf32_jca.Script.Add(new LinkerScript.InputFileSection(".text*")); elf32_jca.Script.Add(new LinkerScript.EndSection()); if (Program.options["rodata-start-addr"].Set) { elf32_jca.Script.Add(new LinkerScript.UpdateOffset(LinkerScript.UpdateOffset.UpdateType.Set, Program.options["rodata-start-addr"].ULong)); } else { elf32_jca.Script.Add(new LinkerScript.UpdateOffset(LinkerScript.UpdateOffset.UpdateType.Align, 4)); } elf32_jca.Script.Add(new LinkerScript.DefineSection(LinkerScript.DefineSection.StandardSection.Rodata)); elf32_jca.Script.Add(new LinkerScript.DefineSymbol("__rodata")); elf32_jca.Script.Add(new LinkerScript.InputFileSection(".rodata*")); elf32_jca.Script.Add(new LinkerScript.EndSection()); if (Program.options["data-start-addr"].Set) { elf32_jca.Script.Add(new LinkerScript.UpdateOffset(LinkerScript.UpdateOffset.UpdateType.Set, Program.options["data-start-addr"].ULong)); } else { elf32_jca.Script.Add(new LinkerScript.UpdateOffset(LinkerScript.UpdateOffset.UpdateType.Align, 4)); } elf32_jca.Script.Add(new LinkerScript.DefineSection(LinkerScript.DefineSection.StandardSection.Data)); elf32_jca.Script.Add(new LinkerScript.DefineSymbol("__data")); elf32_jca.Script.Add(new LinkerScript.InputFileSection(".data*")); elf32_jca.Script.Add(new LinkerScript.EndSection()); if (Program.options["bss-start-addr"].Set) { elf32_jca.Script.Add(new LinkerScript.UpdateOffset(LinkerScript.UpdateOffset.UpdateType.Set, Program.options["bss-start-addr"].ULong)); } else { elf32_jca.Script.Add(new LinkerScript.UpdateOffset(LinkerScript.UpdateOffset.UpdateType.Align, 4)); } elf32_jca.Script.Add(new LinkerScript.DefineSection(LinkerScript.DefineSection.StandardSection.Bss)); elf32_jca.Script.Add(new LinkerScript.DefineSymbol("__bss")); elf32_jca.Script.Add(new LinkerScript.InputFileSection(".bss*")); elf32_jca.Script.Add(new LinkerScript.CommonSection()); elf32_jca.Script.Add(new LinkerScript.DefineSymbol("__end")); elf32_jca.Script.Add(new LinkerScript.EndSection()); Scripts["jca-elf-prog"] = elf32_jca; }
private static void InitElfJCAProg() { // JCA-elf-prog is a JCA program // Specifically: // .text starts at 0x400000 // .rodata follows aligned on a 4 byte boundary // .data follows aligned on a 4 byte boundary // .bss follows aligned on a 4 byte boundary LinkerScript elf32_jca = new LinkerScript(); if (Program.options["epoint"].Set) elf32_jca.Script.Add(new LinkerScript.EntryPoint(Program.options["epoint"].String)); else elf32_jca.Script.Add(new LinkerScript.EntryPoint("_start")); if (!Program.options["nostartfiles"].Set) elf32_jca.Script.Add(new LinkerScript.AddInputFile("crt0.o")); if (Program.options["text-start-addr"].Set) elf32_jca.Script.Add(new LinkerScript.UpdateOffset(LinkerScript.UpdateOffset.UpdateType.Set, Program.options["text-start-addr"].ULong)); else elf32_jca.Script.Add(new LinkerScript.UpdateOffset(LinkerScript.UpdateOffset.UpdateType.Set, 0x400000)); elf32_jca.Script.Add(new LinkerScript.DefineSection(LinkerScript.DefineSection.StandardSection.Text)); elf32_jca.Script.Add(new LinkerScript.DefineSymbol("__begin")); elf32_jca.Script.Add(new LinkerScript.DefineSymbol("__text")); elf32_jca.Script.Add(new LinkerScript.InputFileSection(".text*")); elf32_jca.Script.Add(new LinkerScript.EndSection()); if (Program.options["rodata-start-addr"].Set) elf32_jca.Script.Add(new LinkerScript.UpdateOffset(LinkerScript.UpdateOffset.UpdateType.Set, Program.options["rodata-start-addr"].ULong)); else elf32_jca.Script.Add(new LinkerScript.UpdateOffset(LinkerScript.UpdateOffset.UpdateType.Align, 4)); elf32_jca.Script.Add(new LinkerScript.DefineSection(LinkerScript.DefineSection.StandardSection.Rodata)); elf32_jca.Script.Add(new LinkerScript.DefineSymbol("__rodata")); elf32_jca.Script.Add(new LinkerScript.InputFileSection(".rodata*")); elf32_jca.Script.Add(new LinkerScript.EndSection()); if (Program.options["data-start-addr"].Set) elf32_jca.Script.Add(new LinkerScript.UpdateOffset(LinkerScript.UpdateOffset.UpdateType.Set, Program.options["data-start-addr"].ULong)); else elf32_jca.Script.Add(new LinkerScript.UpdateOffset(LinkerScript.UpdateOffset.UpdateType.Align, 4)); elf32_jca.Script.Add(new LinkerScript.DefineSection(LinkerScript.DefineSection.StandardSection.Data)); elf32_jca.Script.Add(new LinkerScript.DefineSymbol("__data")); elf32_jca.Script.Add(new LinkerScript.InputFileSection(".data*")); elf32_jca.Script.Add(new LinkerScript.EndSection()); if (Program.options["bss-start-addr"].Set) elf32_jca.Script.Add(new LinkerScript.UpdateOffset(LinkerScript.UpdateOffset.UpdateType.Set, Program.options["bss-start-addr"].ULong)); else elf32_jca.Script.Add(new LinkerScript.UpdateOffset(LinkerScript.UpdateOffset.UpdateType.Align, 4)); elf32_jca.Script.Add(new LinkerScript.DefineSection(LinkerScript.DefineSection.StandardSection.Bss)); elf32_jca.Script.Add(new LinkerScript.DefineSymbol("__bss")); elf32_jca.Script.Add(new LinkerScript.InputFileSection(".bss*")); elf32_jca.Script.Add(new LinkerScript.CommonSection()); elf32_jca.Script.Add(new LinkerScript.DefineSymbol("__end")); elf32_jca.Script.Add(new LinkerScript.EndSection()); Scripts["jca-elf-prog"] = elf32_jca; }
private static void InitElfJCA() { // JCA-elf-none is optimized for loading into boot roms. // Specifically: // .text starts at 0x0 // .rodata is included in .text for code size // .bss starts at 0x400000 // .data is included in .bss (and therefore initialized data // is not allowed) LinkerScript elf32_jca = new LinkerScript(); if(Program.options["text-start-addr"].Set) elf32_jca.Script.Add(new LinkerScript.UpdateOffset(LinkerScript.UpdateOffset.UpdateType.Set, Program.options["text-start-addr"].ULong)); elf32_jca.Script.Add(new LinkerScript.DefineSection(LinkerScript.DefineSection.StandardSection.Text)); elf32_jca.Script.Add(new LinkerScript.DefineSymbol("__begin")); elf32_jca.Script.Add(new LinkerScript.DefineSymbol("__text")); elf32_jca.Script.Add(new LinkerScript.InputFileSection(".text*")); elf32_jca.Script.Add(new LinkerScript.DefineSymbol("__rodata")); elf32_jca.Script.Add(new LinkerScript.InputFileSection(".rodata*")); elf32_jca.Script.Add(new LinkerScript.EndSection()); if (Program.options["bss-start-addr"].Set) elf32_jca.Script.Add(new LinkerScript.UpdateOffset(LinkerScript.UpdateOffset.UpdateType.Set, Program.options["bss-start-addr"].ULong)); else elf32_jca.Script.Add(new LinkerScript.UpdateOffset(LinkerScript.UpdateOffset.UpdateType.Set, 0x800000)); elf32_jca.Script.Add(new LinkerScript.DefineSection(LinkerScript.DefineSection.StandardSection.Bss)); elf32_jca.Script.Add(new LinkerScript.DefineSymbol("__bss")); elf32_jca.Script.Add(new LinkerScript.InputFileSection(".bss*")); elf32_jca.Script.Add(new LinkerScript.CommonSection()); elf32_jca.Script.Add(new LinkerScript.DefineSymbol("__data")); elf32_jca.Script.Add(new LinkerScript.InputFileSection(".data*")); elf32_jca.Script.Add(new LinkerScript.DefineSymbol("__end")); elf32_jca.Script.Add(new LinkerScript.EndSection()); Scripts["jca-elf-none"] = elf32_jca; }
static void Main(string[] args) { if (ParseArgs(args) == false) { DispUsage(); return; } InitMaps(); // Initialize the default linker scripts DefaultScripts.InitScripts(); // Load the input files if (ifiles.Count == 0) { Console.WriteLine("No input files!"); return; } List <binary_library.IBinaryFile> inputs = new List <binary_library.IBinaryFile>(); foreach (string ifile in ifiles) { binary_library.elf.ElfFile ef = new binary_library.elf.ElfFile(); ef.Filename = ifile; ef.Read(); inputs.Add(ef); } // Determine the architecture string cur_arch = null; if (options["arch"].Set) { cur_arch = options["arch"].String; } foreach (binary_library.IBinaryFile ifile in inputs) { if (cur_arch == null) { cur_arch = ifile.NameTriple; } } string[] ntriple = cur_arch.Split('-'); if (ntriple.Length != 3) { Console.WriteLine("Error: invalid architecture: " + cur_arch); throw new Exception(); } // Check input files are of the appropriate architecture foreach (var ifile in inputs) { if (ntriple[0] != ifile.Architecture) { Console.WriteLine("Error: " + ifile.Filename + " is not built for architecture " + ntriple[0]); throw new Exception(); } } // Determine output file type string oformat = null; binary_library.Bitness bn = binary_library.Bitness.BitsUnknown; if (options["oformat"].Set) { oformat = options["oformat"].String.ToLower(); if (bitness_map.ContainsKey(oformat)) { bn = bitness_map[oformat]; } if (oformat == "elf32" || oformat == "elf64") { oformat = "elf"; } } else if (oformat_map.ContainsKey(ntriple[1])) { oformat = oformat_map[ntriple[1]]; } else { oformat = "elf"; } if (bn == binary_library.Bitness.BitsUnknown && bitness_map.ContainsKey(ntriple[0])) { bn = bitness_map[ntriple[0]]; } // Create an output file binary_library.IBinaryFile of = null; if (oformat == "elf") { of = new binary_library.elf.ElfFile(bn); } else if (oformat == "binary") { of = new binary_library.binary.FlatBinaryFile(); } else if (oformat == "hex") { of = new binary_library.binary.HexFile(); } else { throw new Exception("Unsupported output format: " + oformat); } if (output_file == null) { output_file = "a.out"; } of.Init(); of.Architecture = ntriple[0]; if (ntriple[1] == "elf" && bn == binary_library.Bitness.Bits64) { of.BinaryType = "elf64"; } else { of.BinaryType = ntriple[1]; } of.OS = ntriple[2]; // Get the linker script LinkerScript script = DefaultScripts.GetScript(ntriple); // Fill out comment section comment += "triple: " + of.Architecture + "-" + of.BinaryType + "-" + of.OS + nl; comment += "arch: " + of.Architecture + nl; comment += "binarytype: " + of.Architecture + nl; comment += "os: " + of.OS + nl; comment += "script: " + script.Name + nl; comment += "comp-date: " + DateTime.Now.ToLongDateString() + " " + DateTime.Now.ToLongTimeString() + nl; comment += "endtl" + nl + "\0"; // Run the script script.RunScript(of, inputs); // ELF specific options if (of is binary_library.elf.ElfFile) { var ef = of as binary_library.elf.ElfFile; ef.CreateHashSection = gen_hash; } of.Filename = output_file; of.Write(); }