/* Linker script for the MN10300 simulator.  */

OUTPUT_FORMAT("elf32-mn10300", "elf32-mn10300", "elf32-mn10300")
OUTPUT_ARCH(mn10300)
ENTRY(_start)
GROUP(-lc -leval -lgcc)
SEARCH_DIR(.);

SECTIONS
{
  /* Read-only sections, merged into text segment: */
  /* Start of RAM (leaving room for Cygmon data) */
  . = 4;

  .interp	 : { *(.interp) 	}
  .hash          : { *(.hash)		}
  .dynsym        : { *(.dynsym)		}
  .dynstr        : { *(.dynstr)		}
  .gnu.version   : { *(.gnu.version)	}
  .gnu.version_d : { *(.gnu.version_d)	}
  .gnu.version_r : { *(.gnu.version_r)	}
  .rel.text      : { *(.rel.text    .rel.text.*    .rel.gnu.linkonce.t*)  }
  .rela.text     : { *(.rela.text   .rela.text.*   .rela.gnu.linkonce.t*) }
  .rel.data      : { *(.rel.data    .rel.data.*    .rel.gnu.linkonce.d*)  }
  .rela.data     : { *(.rela.data   .rela.data.*   .rela.gnu.linkonce.d*) }
  .rel.rodata    : { *(.rel.rodata  .rel.rodata.*  .rel.gnu.linkonce.r*)  }
  .rela.rodata   : { *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r*) }
  .rel.got       : { *(.rel.got)	}
  .rela.got      : { *(.rela.got)	}
  .rel.ctors     : { *(.rel.ctors)	}
  .rela.ctors    : { *(.rela.ctors)	}
  .rel.dtors     : { *(.rel.dtors)	}
  .rela.dtors    : { *(.rela.dtors)	}
  .rel.init      : { *(.rel.init)	}
  .rela.init     : { *(.rela.init)	}
  .rel.fini      : { *(.rel.fini)	}
  .rela.fini     : { *(.rela.fini)	}
  .rel.bss       : { *(.rel.bss  .rel.bss.*  .rel.gnu.linkonce.b.*)	}
  .rela.bss      : { *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*)	}
  .rel.plt       : { *(.rel.plt)	}
  .rela.plt      : { *(.rela.plt)	}
  .init          : { KEEP (*(.init))	} =0
  .plt      	 : { *(.plt)		}
  .text      :
  {
    *(.text .stub .text.*)
    KEEP (*(.text.*personality*))
    /* .gnu.warning sections are handled specially by elf32.em.  */
    *(.gnu.warning)
    *(.gnu.linkonce.t*)
    *(.gcc_except_table)
  } =0
  _etext = .;
  PROVIDE (etext = .);
  .fini      : { KEEP (*(.fini))    } =0
  .rodata    : { *(.rodata .rodata.* .gnu.linkonce.r*) }
  .rodata1   : { *(.rodata1) }
  /* Adjust the address for the data segment.  We want to adjust up to
     the same address within the page on the next page up.  */
  . = ALIGN(1) + (. & (1 - 1));
  .data    :
  {
    *(.data .data.* .gnu.linkonce.d.*)
    KEEP (*(.gnu.linkonce.d.*personality*))
    CONSTRUCTORS
  }
  .data1   : { *(.data1) }
  .ctors         :
  {
    ___ctors = .;
    KEEP(*crtbegin.o(.ctors))
    KEEP(*(SORT(.ctors.*)))
    KEEP(*(.ctors))
    ___ctors_end = .;
  }
  .dtors         :
  {
    ___dtors = .;
    KEEP(*crtbegin.o(.dtors))
    KEEP(*(SORT(.dtors.*)))
    KEEP(*(.dtors))
    ___dtors_end = .;
  }
  .got           : { *(.got.plt) *(.got) }
  .dynamic       : { *(.dynamic) }
  /* We want the small data sections together, so single-instruction offsets
     can access them all, and initialized data all before uninitialized, so
     we can shorten the on-disk segment size.  */
  .sdata     : { *(.sdata .sdata.* .gnu.linkonce.s.*) }
  _edata  =  .;
  PROVIDE (edata = .);
  __bss_start = .;
  .sbss      : { *(.dynsbss) *(.sbss .sbss.* .gnu.linkonce.sb.*) *(.scommon) }
  .bss       :
  {
   *(.dynbss)
   *(.bss .bss.* .gnu.linkonce.b.*)
   *(COMMON)
  }
  _end = . ;
  PROVIDE (end = .);
  /* Stabs debugging sections.  */
  .stab 0 : { *(.stab) }
  .stabstr 0 : { *(.stabstr) }
  .stab.excl 0 : { *(.stab.excl) }
  .stab.exclstr 0 : { *(.stab.exclstr) }
  .stab.index 0 : { *(.stab.index) }
  .stab.indexstr 0 : { *(.stab.indexstr) }
  .comment 0 : { *(.comment) }
  /* DWARF debug sections.
     Symbols in the DWARF debugging sections are relative to the beginning
     of the section so we begin them at 0.  */
  /* DWARF 1 */
  .debug          0 : { *(.debug) }
  .line           0 : { *(.line) }
  /* GNU DWARF 1 extensions */
  .debug_srcinfo  0 : { *(.debug_srcinfo) }
  .debug_sfnames  0 : { *(.debug_sfnames) }
  /* DWARF 1.1 and DWARF 2 */
  .debug_aranges  0 : { *(.debug_aranges) }
  .debug_pubnames 0 : { *(.debug_pubnames) }
  /* DWARF 2 */
  .debug_info     0 : { *(.debug_info .gnu.linkonce.wi.*) }
  .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_ranges   0 : { *(.debug_ranges) }
  /* SGI/MIPS DWARF 2 extensions */
  .debug_weaknames 0 : { *(.debug_weaknames) }
  .debug_funcnames 0 : { *(.debug_funcnames) }
  .debug_typenames 0 : { *(.debug_typenames) }
  .debug_varnames  0 : { *(.debug_varnames) }

  .stack 0x80000 : { _stack = .; *(.stack) *(._stack) }
}
