예제 #1
0
        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;
        }
예제 #2
0
        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;
        }
예제 #3
0
        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;
        }
예제 #4
0
        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;
        }
예제 #5
0
        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;
        }
예제 #6
0
        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;
        }
예제 #7
0
        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;
        }
예제 #8
0
        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;
        }
예제 #9
0
        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();
        }