+
+/* Linker script for Magpie RAM-based applications */
+
+/*
+Currently, ROM code reserves the first 8KB of RAM for its data/bss.
+The next 12KB or RAM is used for RAM software's literals and read-only data.
+After that comes 64KB reserved for RAM software's data and bss.
+Then 92KB of RAM is reserved for text (code).
+The last 8KB of RAM is reserved for ROM patches, customer DataSets,
+and RAM software expansion. (There is also some additional RAM between
+segments that can be used, if needed.)
+ ROM reserved: 0x00500000..0x00501fff
+ Literals: 0x00502000..0x00504fff
+ Data: 0x00505000..0x00514fff
+ Text: 0x00915000..0x0092bfff
+TBD: May want to use a 2-pass link approach in order to
+eliminate fixed boundaries. Support for physical addressing
+in Tensilica tools would be helpful, but it's not coming
+any time soon.
+*/
+
+/* dram_seg: 0x504000, see target.rom.ld */
+
+/* ***** */
+MEMORY
+{
+ lit_seg : org = 0x004E5200, len = 0x1DE00
+ iram_seg : org = 0x00903000, len = 0x9B40
+ dram_seg : org = 0x0050CB40, len = 0x1800
+
+}
+
+PHDRS
+{
+ lit_phdr PT_LOAD;
+ dram_phdr PT_LOAD;
+ iram_phdr PT_LOAD;
+}
+
+/* Default entry point: */
+ENTRY(app_start)
+
+SECTIONS
+{
+ /*
+ * This empty section is used to convince RAM linkage
+ * to share litbase with ROM code.
+ */
+ .lit4 (NOLOAD) :
+ {
+ _rom_literal_start = ABSOLUTE(.);
+ . += 0x1BE00; /* Reserved virtual space for physical mem gap and ROM */
+ _lit4_start = ABSOLUTE(.);
+ _lit4_end = ABSOLUTE(.);
+ _rom_literal_end = ABSOLUTE(.);
+ } >lit_seg :NONE
+
+ .dport0.rodata :
+ {
+ _dport0_rodata_start = ABSOLUTE(.); /* 0x505000 */
+ *(.dport0.rodata)
+ *(.dport.rodata)
+ _dport0_rodata_end = ABSOLUTE(.);
+ } >lit_seg :lit_phdr
+
+ .dport0.literal :
+ {
+ _dport0_literal_start = ABSOLUTE(.);
+ *(.dport0.literal)
+ *(.dport.literal)
+ _dport0_literal_end = ABSOLUTE(.);
+ } >lit_seg :lit_phdr
+
+ .dram0.rodata :
+ {
+ _dram0_rodata_start = ABSOLUTE(.);
+ *(.dram0.rodata)
+ *(.dram.rodata)
+ _dram0_rodata_end = ABSOLUTE(.);
+ } >lit_seg :lit_phdr
+
+ .rodata :
+ {
+ _rodata_start = ABSOLUTE(.);
+ *(.rodata)
+ *(.rodata.*)
+ *(.gnu.linkonce.r.*)
+ *(.rodata1)
+ __XT_EXCEPTION_TABLE__ = ABSOLUTE(.);
+ *(.xt_except_table)
+ *(.gcc_except_table)
+ *(.gnu.linkonce.e.*)
+ *(.gnu.version_r)
+ . = ALIGN(4); /* this table MUST be 4-byte aligned */
+ _bss_table_start = ABSOLUTE(.);
+ LONG(_dport0_bss_start)
+ LONG(_dport0_bss_end)
+ LONG(_bss_start)
+ LONG(_bss_end)
+ _bss_table_end = ABSOLUTE(.);
+ _rodata_end = ABSOLUTE(.);
+ } >lit_seg :lit_phdr
+
+ .literals :
+ {
+ _literals_start = ABSOLUTE(.);
+ *(*.lit4)
+ *(.gnu.linkonce.lit4.*)
+ _literals_end = ABSOLUTE(.);
+ } >lit_seg :lit_phdr
+
+ .dram0.literal :
+ {
+ _dram0_literal_start = ABSOLUTE(.);
+ *(.dram0.literal)
+ *(.dram.literal)
+ _dram0_literal_end = ABSOLUTE(.);
+ } >lit_seg :lit_phdr
+
+ .dport0.data :
+ {
+ _dport0_data_start = ABSOLUTE(.);
+ *(.dport0.data)
+ *(.dport.data)
+ _dport0_data_end = ABSOLUTE(.);
+ } >dram_seg :dram_phdr
+
+ .dport0.bss :
+ {
+ . = ALIGN (8);
+ _dport0_bss_start = ABSOLUTE(.);
+ *(.dport0.bss)
+ . = ALIGN (8);
+ _dport0_bss_end = ABSOLUTE(.);
+ } >dram_seg :dram_phdr
+
+ .dram0.data :
+ {
+ _dram0_data_start = ABSOLUTE(.);
+ *(.dram0.data)
+ *(.dram.data)
+ _dram0_data_end = ABSOLUTE(.);
+ } >dram_seg :dram_phdr
+
+ .data :
+ {
+ _data_start = ABSOLUTE(.);
+ *(.data)
+ *(.data.*)
+ *(.gnu.linkonce.d.*)
+ *(.data1)
+ *(.sdata)
+ *(.sdata.*)
+ *(.gnu.linkonce.s.*)
+ *(.sdata2)
+ *(.sdata2.*)
+ *(.gnu.linkonce.s2.*)
+ *(.jcr)
+ *(.eh_frame)
+ /* C++ constructor and destructor tables, properly ordered: */
+ KEEP (*crtbegin.o(.ctors))
+ KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))
+ KEEP (*(SORT(.ctors.*)))
+ KEEP (*(.ctors))
+ KEEP (*crtbegin.o(.dtors))
+ KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))
+ KEEP (*(SORT(.dtors.*)))
+ KEEP (*(.dtors))
+ /* C++ exception handlers table: */
+ __XT_EXCEPTION_DESCS__ = ABSOLUTE(.);
+ *(.xt_except_desc)
+ *(.gnu.linkonce.h.*)
+ __XT_EXCEPTION_DESCS_END__ = ABSOLUTE(.);
+ *(.xt_except_desc_end)
+ *(.dynamic)
+ *(.gnu.version_d)
+ _data_end = ABSOLUTE(.);
+ } >dram_seg :dram_phdr
+
+ .bss :
+ {
+ . = ALIGN (8);
+ _bss_start = ABSOLUTE(.);
+ *(.dynsbss)
+ *(.sbss)
+ *(.sbss.*)
+ *(.gnu.linkonce.sb.*)
+ *(.scommon)
+ *(.sbss2)
+ *(.sbss2.*)
+ *(.gnu.linkonce.sb2.*)
+ *(.dynbss)
+ *(.bss)
+ *(.bss.*)
+ *(.gnu.linkonce.b.*)
+ *(COMMON)
+ *(.dram0.bss)
+ . = ALIGN (8);
+ _bss_end = ABSOLUTE(.);
+ _end = ALIGN(0x8);
+ PROVIDE(end = ALIGN(0x8));
+ _fw_image_end = ABSOLUTE(.);
+ /*_stack_sentry = ALIGN(0x8);*/
+ } >dram_seg :dram_phdr
+
+ .text :
+ {
+ _stext = .;
+ _text_start = ABSOLUTE(.);
+ *(.entry.text)
+ *(.init.literal)
+ *(.init)
+ *(.literal .text .text.* .stub .gnu.warning .gnu.linkonce.literal.* .gnu.linkonce.t.*.literal .gnu.linkonce.t.*)
+ *(.fini.literal)
+ *(.fini)
+ *(.gnu.version)
+ _text_end = ABSOLUTE(.);
+ _etext = .;
+ } >iram_seg :iram_phdr
+
+ .iram0.text :
+ {
+ _iram0_text_start = ABSOLUTE(.);
+ *(.iram0.literal .iram.literal .iram.text.literal .iram0.text .iram.text)
+ _iram0_text_end = ABSOLUTE(.);
+ } >iram_seg :iram_phdr
+
+ .debug 0 : { *(.debug) }
+ .line 0 : { *(.line) }
+ .debug_srcinfo 0 : { *(.debug_srcinfo) }
+ .debug_sfnames 0 : { *(.debug_sfnames) }
+ .debug_aranges 0 : { *(.debug_aranges) }
+ .debug_pubnames 0 : { *(.debug_pubnames) }
+ .debug_info 0 : { *(.debug_info) }
+ .debug_abbrev 0 : { *(.debug_abbrev) }
+ .debug_line 0 : { *(.debug_line) }
+ .debug_frame 0 : { *(.debug_frame) }
+ .debug_str 0 : { *(.debug_str) }
+ .debug_loc 0 : { *(.debug_loc) }
+ .debug_macinfo 0 : { *(.debug_macinfo) }
+ .debug_weaknames 0 : { *(.debug_weaknames) }
+ .debug_funcnames 0 : { *(.debug_funcnames) }
+ .debug_typenames 0 : { *(.debug_typenames) }
+ .debug_varnames 0 : { *(.debug_varnames) }
+
+ .xt.insn 0 :
+ {
+ KEEP (*(.xt.insn))
+ KEEP (*(.gnu.linkonce.x.*))
+ }
+ .xt.prop 0 :
+ {
+ KEEP (*(.xt.prop))
+ KEEP (*(.gnu.linkonce.prop.*))
+ }
+ .xt.lit 0 :
+ {
+ KEEP (*(.xt.lit))
+ KEEP (*(.gnu.linkonce.p.*))
+ }
+}