Index: c/src/lib/libbsp/sh/gensh4/startup/.cvsignore
===================================================================
--- c/src/lib/libbsp/sh/gensh4/startup/.cvsignore	(revision 96462044ce9a80c6caed1ce06466cbc2ae911780)
+++ c/src/lib/libbsp/sh/gensh4/startup/.cvsignore	(revision 96462044ce9a80c6caed1ce06466cbc2ae911780)
@@ -0,0 +1,2 @@
+Makefile
+Makefile.in
Index: c/src/lib/libbsp/sh/gensh4/startup/Makefile.am
===================================================================
--- c/src/lib/libbsp/sh/gensh4/startup/Makefile.am	(revision 96462044ce9a80c6caed1ce06466cbc2ae911780)
+++ c/src/lib/libbsp/sh/gensh4/startup/Makefile.am	(revision 96462044ce9a80c6caed1ce06466cbc2ae911780)
@@ -0,0 +1,47 @@
+##
+## $Id$
+##
+
+AUTOMAKE_OPTIONS = foreign 1.4
+
+VPATH = @srcdir@:@srcdir@/../../shared:@srcdir@/../../../shared
+
+PGM = $(ARCH)/startup.rel
+
+C_FILES = bsplibc.c bsppost.c bspstart.c bspclean.c sbrk.c \
+    bootcard.c main.c gnatinstallhandler.c
+
+C_O_FILES = $(C_FILES:%.c=$(ARCH)/%.o)
+
+OBJS = $(C_O_FILES)
+
+include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg
+include $(top_srcdir)/../../../../../../automake/compile.am
+include $(top_srcdir)/../../../../../../automake/lib.am
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+$(PROJECT_RELEASE)/lib/linkcmds: linkcmds
+	$(INSTALL_DATA) $< $@
+
+$(PROJECT_RELEASE)/lib/linkcmds.rom: linkcmds.rom
+	$(INSTALL_DATA) $< $@
+
+$(PROJECT_RELEASE)/lib/linkcmds.rom2ram: linkcmds.rom2ram
+	$(INSTALL_DATA) $< $@
+
+$(PGM): $(OBJS)
+	$(make-rel)
+
+TMPINSTALL_FILES += $(PROJECT_RELEASE)/lib/linkcmds $(PROJECT_RELEASE)/lib/linkcmds.rom \
+                    $(PROJECT_RELEASE)/lib/linkcmds.rom2ram
+
+all-local: $(ARCH) $(TMPINSTALL_FILES) $(OBJS) $(PGM)
+
+.PRECIOUS: $(PGM)
+
+EXTRA_DIST = bspclean.c bspstart.c linkcmds linkcmds.rom linkcmds.rom2ram
+
+include $(top_srcdir)/../../../../../../automake/local.am
Index: c/src/lib/libbsp/sh/gensh4/startup/bspstart.c
===================================================================
--- c/src/lib/libbsp/sh/gensh4/startup/bspstart.c	(revision 96462044ce9a80c6caed1ce06466cbc2ae911780)
+++ c/src/lib/libbsp/sh/gensh4/startup/bspstart.c	(revision 96462044ce9a80c6caed1ce06466cbc2ae911780)
@@ -0,0 +1,146 @@
+/*
+ *  This routine starts the application.  It includes application,
+ *  board, and monitor specific initialization and configuration.
+ *  The generic CPU dependent initialization has been performed
+ *  before this routine is invoked.
+ *
+ *  Authors: Ralf Corsepius (corsepiu@faw.uni-ulm.de) and
+ *           Bernd Becker (becker@faw.uni-ulm.de)
+ *
+ *  COPYRIGHT (c) 1997-1998, FAW Ulm, Germany
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ *
+ *  COPYRIGHT (c) 1998-2001.
+ *  On-Line Applications Research Corporation (OAR).
+ *
+ *  The license and distribution terms for this file may be
+ *  found in the file LICENSE in this distribution or at
+ *  http://www.OARcorp.com/rtems/license.html.
+ *
+ *  $Id$
+ */
+
+#include <bsp.h>
+#include <rtems/libio.h>
+ 
+#include <rtems/libcsupport.h>
+ 
+#include <string.h>
+ 
+/*
+ *  The original table from the application and our copy of it with
+ *  some changes.
+ */
+
+extern void bsp_hw_init(void);
+
+extern rtems_configuration_table Configuration;
+
+rtems_configuration_table  BSP_Configuration;
+
+rtems_cpu_table Cpu_table;
+
+char *rtems_progname;
+
+/*
+ * This variable is nesessary for console driver.
+ */
+unsigned32 SH4_CPU_HZ_Frequency = HZ;
+
+/*
+ *  Use the shared implementations of the following routines
+ */
+ 
+void bsp_postdriver_hook(void);
+void bsp_libc_init( void *, unsigned32, int );
+
+/*
+ *  Function:   bsp_pretasking_hook
+ *
+ *  Description:
+ *      BSP pretasking hook.  Called just before drivers are initialized.
+ *      Used to setup libc and install any BSP extensions.
+ *
+ *  NOTES:
+ *      Must not use libc (to do io) from here, since drivers are
+ *      not yet initialized.
+ *
+ */
+ 
+void bsp_pretasking_hook(void)
+{
+    bsp_libc_init(&HeapStart, (&HeapEnd - &HeapStart), 0);
+ 
+#ifdef RTEMS_DEBUG
+    rtems_debug_enable( RTEMS_DEBUG_ALL_MASK );
+#endif
+}
+
+/*
+ *  bsp_start
+ *
+ *  This routine does the bulk of the system initialization.
+ */
+
+void bsp_start(void)
+{
+  /*
+     For real boards you need to setup the hardware 
+     and need to copy the vector table from rom to ram.
+
+     Depending on the board this can ether be done from inside the rom 
+     startup code, rtems startup code or here.
+   */
+
+#ifndef START_HW_INIT
+  /* board hardware setup here, or from 'start.S' */
+  bsp_hw_init();
+#endif
+
+  /*
+   *  Allocate the memory for the RTEMS Work Space.  This can come from
+   *  a variety of places: hard coded address, malloc'ed from outside
+   *  RTEMS world (e.g. simulator or primitive memory manager), or (as
+   *  typically done by stock BSPs) by subtracting the required amount
+   *  of work space from the last physical address on the CPU board.
+   */
+
+  /*
+   *  Need to "allocate" the memory for the RTEMS Workspace and
+   *  tell the RTEMS configuration where it is.  This memory is
+   *  not malloc'ed.  It is just "pulled from the air".
+   */
+
+  BSP_Configuration.work_space_start = (void *) &WorkSpaceStart ;
+  BSP_Configuration.work_space_size  = 
+    (unsigned32) &WorkSpaceEnd - 
+    (unsigned32) &WorkSpaceStart ;
+  
+  /*
+   *  initialize the CPU table for this BSP
+   */
+
+#if ( CPU_ALLOCATE_INTERRUPT_STACK == FALSE )
+  _CPU_Interrupt_stack_low = &CPU_Interrupt_stack_low ;
+  _CPU_Interrupt_stack_high = &CPU_Interrupt_stack_high ;
+
+  /* This isn't used anywhere */
+  Cpu_table.interrupt_stack_size = 
+    (unsigned32) (&CPU_Interrupt_stack_high) -
+    (unsigned32) (&CPU_Interrupt_stack_low) ;
+#endif
+
+
+  Cpu_table.pretasking_hook = bsp_pretasking_hook;  /* init libc, etc. */
+  Cpu_table.postdriver_hook = bsp_postdriver_hook;
+
+#if ( CPU_ALLOCATE_INTERRUPT_STACK == TRUE )
+  Cpu_table.interrupt_stack_size = CONFIGURE_INTERRUPT_STACK_MEMORY;
+#endif
+
+  Cpu_table.clicks_per_second = HZ ;
+}
Index: c/src/lib/libbsp/sh/gensh4/startup/linkcmds
===================================================================
--- c/src/lib/libbsp/sh/gensh4/startup/linkcmds	(revision 96462044ce9a80c6caed1ce06466cbc2ae911780)
+++ c/src/lib/libbsp/sh/gensh4/startup/linkcmds	(revision 96462044ce9a80c6caed1ce06466cbc2ae911780)
@@ -0,0 +1,187 @@
+/*
+ * This file contains GNU linker directives for an general SH4 
+ * board.
+ *
+ * Variations in memory size and allocation can be made by
+ * overriding some values with linker command-line arguments.
+ *
+ * Copyright (C) 2000 OKTET Ltd., St.-Petersburg, Russia
+ * Author: Victor V. Vengerov <vvv@oktet.ru>
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ *
+ * http://www.OARcorp.com/rtems/license.html.
+ * 
+ *  $Id$
+ */
+
+
+OUTPUT_FORMAT("elf32-shl", "elf32-shl",
+	      "elf32-shl")
+OUTPUT_ARCH(sh)
+ENTRY(_start)
+/* Do we need any of these for elf?
+   __DYNAMIC = 0;    */
+
+_HeapSize = DEFINED(_HeapSize) ? _HeapSize : (2 * 1024 * 1024);
+_WorkspaceSize = DEFINED(_WorkspaceSize) ? _WorkspaceSize : (1024 * 1024);
+
+/*
+ * Area assignments:
+ *     Area 0: Flash memory, SRAM interface
+ *     Area 1: GDC
+ *     Area 2: SDRAM
+ *     Area 3-6: unused
+ */
+MEMORY
+{
+  ram           : o = 0x88100000, l = 7M
+  rom           : o = 0x80000000, l = 4M
+}
+
+SECTIONS
+{
+  /* Read-only sections, merged into text segment: */
+  .init          : 
+  { 
+    KEEP (*(.init))
+  } =0
+  .text      :
+  {
+    *(.text)
+    *(.text.*)
+    /* .gnu.warning sections are handled specially by elf32.em.  */
+    *(.gnu.warning)
+    *(.gnu.linkonce.t*)
+  } > ram
+  _etext = .;
+  PROVIDE (etext = .);
+  .fini      :
+  {
+    KEEP (*(.fini))
+  } =0
+  .rodata   : 
+  { 
+    *(.rodata) 
+    *(.rodata.*) 
+    *(.gnu.linkonce.r*) 
+  } > ram
+  .ctors   : 
+  {
+    ___ctors = .;
+    /* gcc uses crtbegin.o to find the start of
+       the constructors, so we make sure it is
+       first.  Because this is a wildcard, it
+       doesn't matter if the user does not
+       actually link against crtbegin.o; the
+       linker won't look for a file to match a
+       wildcard.  The wildcard also means that it
+       doesn't matter which directory crtbegin.o
+       is in.  */
+    KEEP (*crtbegin.o(.ctors))
+    /* We don't want to include the .ctor section from
+       from the crtend.o file until after the sorted ctors.
+       The .ctor section from the crtend file contains the
+       end of ctors marker and it must be last */
+    KEEP (*(EXCLUDE_FILE (*crtend.o ) .ctors))
+    KEEP (*(SORT(.ctors.*)))
+    KEEP (*(.ctors))
+    ___ctors_end = .;
+  } > ram
+   .dtors         :
+  {
+    ___dtors = .;
+    KEEP (*crtbegin.o(.dtors))
+    KEEP (*(EXCLUDE_FILE (*crtend.o ) .dtors))
+    KEEP (*(SORT(.dtors.*)))
+    KEEP (*(.dtors))
+    ___dtors_end = .;
+    copy_start_in_rom = .;
+  } > ram
+
+  /* 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(128) + (. & (128 - 1));
+  .data    :
+  {
+    copy_start = .;
+    *(.data)
+    *(.data.*)
+    *(.gnu.linkonce.d*)
+    SORT(CONSTRUCTORS)
+    copy_end = .;
+  } > ram
+  .eh_frame : { *(.eh_frame) } > ram
+  /* 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.  */
+  .bss       :
+  {
+   __bss_start = .;
+   *(.dynbss)
+   *(.bss)
+   *(.bss.*)
+   *(COMMON)
+   /* Align here to ensure that the .bss section occupies space up to
+      _end.  Align after .bss to ensure correct alignment even if the
+      .bss section disappears because there are no input sections.  */
+   . = ALIGN(32 / 8);
+   __bss_end = .;
+  } > ram
+
+  . = ALIGN(16);
+  _HeapStart = . ;
+  . = . + _HeapSize ;
+  PROVIDE( _HeapEnd = . );
+
+  . = ALIGN(16);
+  _WorkSpaceStart = . ;
+  . = . + _WorkspaceSize ;
+  PROVIDE(_WorkSpaceEnd = .);
+
+  . = ALIGN(16);
+  .stack . : {
+    . = . + 4096;
+  }
+
+  . = ALIGN(16);
+  _CPU_Interrupt_stack_low  = . ;
+  _CPU_Interrupt_stack_high = _CPU_Interrupt_stack_low + 4096 ;
+
+  /* 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) }
+  .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) }
+  /* 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 : { _stack = .; *(.stack) }
+  /* These must appear regardless of  .  */
+}
Index: c/src/lib/libbsp/sh/gensh4/startup/linkcmds.rom
===================================================================
--- c/src/lib/libbsp/sh/gensh4/startup/linkcmds.rom	(revision 96462044ce9a80c6caed1ce06466cbc2ae911780)
+++ c/src/lib/libbsp/sh/gensh4/startup/linkcmds.rom	(revision 96462044ce9a80c6caed1ce06466cbc2ae911780)
@@ -0,0 +1,200 @@
+/*
+ * This file contains GNU linker directives for an general SH4 
+ * board.
+ *
+ * Variations in memory size and allocation can be made by
+ * overriding some values with linker command-line arguments.
+ *
+ * Copyright (C) 2000 OKTET Ltd., St.-Petersburg, Russia
+ * Author: Victor V. Vengerov <vvv@oktet.ru>
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ *
+ * http://www.OARcorp.com/rtems/license.html.
+ * 
+ *  $Id$
+ */
+
+
+OUTPUT_FORMAT("elf32-shl", "elf32-shl",
+	      "elf32-shl")
+OUTPUT_ARCH(sh)
+ENTRY(_start)
+/* Do we need any of these for elf?
+   __DYNAMIC = 0;    */
+
+_HeapSize = DEFINED(_HeapSize) ? _HeapSize : (2 * 1024 * 1024);
+_WorkspaceSize = DEFINED(_WorkspaceSize) ? _WorkspaceSize : (1024 * 1024);
+
+/*
+ * Area assignments:
+ *     Area 0: Flash memory, SRAM interface
+ *     Area 1: GDC
+ *     Area 2: SDRAM
+ *     Area 3-6: unused
+ */
+MEMORY
+{
+/*
+ * Real values
+ */
+  ram           : o = 0x88000000, l = 8M
+  rom           : o = 0x80000000, l = 4M
+/*
+ * Fake values to test from gdb
+ */
+/*
+  ram           : o = 0x88100000, l = 4M
+  rom           : o = 0x88500000, l = 3M
+*/
+}
+
+SECTIONS
+{
+  /* Read-only sections, merged into text segment: */
+  .init          : 
+  { 
+    KEEP (*(.init))
+  } =0
+  .text      :
+  {
+    *(.text)
+    *(.text.*)
+    /* .gnu.warning sections are handled specially by elf32.em.  */
+    *(.gnu.warning)
+    *(.gnu.linkonce.t*)
+  } > rom
+  _etext = .;
+  PROVIDE (etext = .);
+  .fini      :
+  {
+    KEEP (*(.fini))
+  } =0
+  .rodata   : 
+  { 
+    *(.rodata) 
+    *(.rodata.*) 
+    *(.gnu.linkonce.r*) 
+    . = ALIGN(32);
+  } > rom
+  .ctors   : 
+  {
+    ___ctors = .;
+    /* gcc uses crtbegin.o to find the start of
+       the constructors, so we make sure it is
+       first.  Because this is a wildcard, it
+       doesn't matter if the user does not
+       actually link against crtbegin.o; the
+       linker won't look for a file to match a
+       wildcard.  The wildcard also means that it
+       doesn't matter which directory crtbegin.o
+       is in.  */
+    KEEP (*crtbegin.o(.ctors))
+    /* We don't want to include the .ctor section from
+       from the crtend.o file until after the sorted ctors.
+       The .ctor section from the crtend file contains the
+       end of ctors marker and it must be last */
+    KEEP (*(EXCLUDE_FILE (*crtend.o ) .ctors))
+    KEEP (*(SORT(.ctors.*)))
+    KEEP (*(.ctors))
+    ___ctors_end = .;
+  } > rom
+   .dtors         :
+  {
+    ___dtors = .;
+    KEEP (*crtbegin.o(.dtors))
+    KEEP (*(EXCLUDE_FILE (*crtend.o ) .dtors))
+    KEEP (*(SORT(.dtors.*)))
+    KEEP (*(.dtors))
+    ___dtors_end = .;
+    copy_start_in_rom = .;
+  } > rom
+
+  /* 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(128) + (. & (128 - 1));
+  .data     : AT(LOADADDR(.dtors) + SIZEOF(.dtors))
+  {
+    copy_start = .;
+    *(.data)
+    *(.data.*)
+    *(.gnu.linkonce.d*)
+    SORT(CONSTRUCTORS)
+    copy_end = .;
+  } > ram
+  .eh_frame : { *(.eh_frame) } > ram
+  /* 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.  */
+  .bss       :
+  {
+   __bss_start = .;
+   *(.dynbss)
+   *(.bss)
+   *(.bss.*)
+   *(COMMON)
+   /* Align here to ensure that the .bss section occupies space up to
+      _end.  Align after .bss to ensure correct alignment even if the
+      .bss section disappears because there are no input sections.  */
+   . = ALIGN(32 / 8);
+   __bss_end = .;
+  } > ram
+
+  . = ALIGN(16);
+  _HeapStart = . ;
+  . = . + _HeapSize ;
+  PROVIDE( _HeapEnd = . );
+
+  . = ALIGN(16);
+  _WorkSpaceStart = . ;
+  . = . + _WorkspaceSize ;
+  PROVIDE(_WorkSpaceEnd = .);
+
+  . = ALIGN(16);
+  .stack . : {
+     stack_start = .;
+     . = . + 4096;
+     stack_end = .;
+  }
+
+  . = ALIGN(16);
+  _CPU_Interrupt_stack_low  = . ;
+  _CPU_Interrupt_stack_high = _CPU_Interrupt_stack_low + 4096 ;
+
+  /* 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) }
+  .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) }
+  /* 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 : { _stack = .; *(.stack) }
+  /* These must appear regardless of  .  */
+}
Index: c/src/lib/libbsp/sh/gensh4/startup/linkcmds.rom2ram
===================================================================
--- c/src/lib/libbsp/sh/gensh4/startup/linkcmds.rom2ram	(revision 96462044ce9a80c6caed1ce06466cbc2ae911780)
+++ c/src/lib/libbsp/sh/gensh4/startup/linkcmds.rom2ram	(revision 96462044ce9a80c6caed1ce06466cbc2ae911780)
@@ -0,0 +1,203 @@
+/*
+ * This file contains GNU linker directives for an general SH4 
+ * board.
+ *
+ * Variations in memory size and allocation can be made by
+ * overriding some values with linker command-line arguments.
+ *
+ * Copyright (C) 2000 OKTET Ltd., St.-Petersburg, Russia
+ * Author: Victor V. Vengerov <vvv@oktet.ru>
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ *
+ * http://www.OARcorp.com/rtems/license.html.
+ * 
+ *  $Id$
+ */
+
+
+OUTPUT_FORMAT("elf32-shl", "elf32-shl",
+	      "elf32-shl")
+OUTPUT_ARCH(sh)
+ENTRY(_start)
+/* Do we need any of these for elf?
+   __DYNAMIC = 0;    */
+
+_HeapSize = DEFINED(_HeapSize) ? _HeapSize : (2 * 1024 * 1024);
+_WorkspaceSize = DEFINED(_WorkspaceSize) ? _WorkspaceSize : (1024 * 1024);
+
+/*
+ * Area assignments:
+ *     Area 0: Flash memory, SRAM interface
+ *     Area 1: GDC
+ *     Area 2: SDRAM
+ *     Area 3-6: unused
+ */
+MEMORY
+{
+/*
+ * Real values
+ */
+  ram           : o = 0x88000000, l = 8M
+  rom           : o = 0x80000000, l = 4M
+/*
+ * Fake values to test from gdb
+ */
+/*
+  ram           : o = 0x88100000, l = 4M
+  rom           : o = 0x88500000, l = 3M
+*/
+}
+
+SECTIONS
+{
+  rom : {
+    copy_start_in_rom = .;
+  } >rom
+
+  /* Read-only sections, merged into text segment: */
+  .init          : 
+  { 
+    KEEP (*(.init))
+  } =0
+  .text      : AT(copy_start_in_rom)
+  {
+    copy_start = .;
+    *(.text)
+    *(.text.*)
+    /* .gnu.warning sections are handled specially by elf32.em.  */
+    *(.gnu.warning)
+    *(.gnu.linkonce.t*)
+  } > ram
+  _etext = .;
+  PROVIDE (etext = .);
+  .fini      :
+  {
+    KEEP (*(.fini))
+  } =0
+  .rodata   :  AT(LOADADDR(.text) + SIZEOF(.text))
+  { 
+    *(.rodata) 
+    *(.rodata.*) 
+    *(.gnu.linkonce.r*) 
+    . = ALIGN(32);
+  } > ram
+  .ctors   :  AT(LOADADDR(.rodata) + SIZEOF(.rodata))
+  {
+    ___ctors = .;
+    /* gcc uses crtbegin.o to find the start of
+       the constructors, so we make sure it is
+       first.  Because this is a wildcard, it
+       doesn't matter if the user does not
+       actually link against crtbegin.o; the
+       linker won't look for a file to match a
+       wildcard.  The wildcard also means that it
+       doesn't matter which directory crtbegin.o
+       is in.  */
+    KEEP (*crtbegin.o(.ctors))
+    /* We don't want to include the .ctor section from
+       from the crtend.o file until after the sorted ctors.
+       The .ctor section from the crtend file contains the
+       end of ctors marker and it must be last */
+    KEEP (*(EXCLUDE_FILE (*crtend.o ) .ctors))
+    KEEP (*(SORT(.ctors.*)))
+    KEEP (*(.ctors))
+    ___ctors_end = .;
+  } > ram
+   .dtors         : AT(LOADADDR(.ctors) + SIZEOF(.ctors))
+  {
+    ___dtors = .;
+    KEEP (*crtbegin.o(.dtors))
+    KEEP (*(EXCLUDE_FILE (*crtend.o ) .dtors))
+    KEEP (*(SORT(.dtors.*)))
+    KEEP (*(.dtors))
+    ___dtors_end = .;
+  } > ram
+
+  /* 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(128) + (. & (128 - 1));
+  .data     : AT(LOADADDR(.dtors) + SIZEOF(.dtors))
+  {
+    *(.data)
+    *(.data.*)
+    *(.gnu.linkonce.d*)
+    SORT(CONSTRUCTORS)
+    copy_end = .;
+  } > ram
+  .eh_frame : { *(.eh_frame) } > ram
+  /* 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.  */
+  .bss       :
+  {
+   __bss_start = .;
+   *(.dynbss)
+   *(.bss)
+   *(.bss.*)
+   *(COMMON)
+   /* Align here to ensure that the .bss section occupies space up to
+      _end.  Align after .bss to ensure correct alignment even if the
+      .bss section disappears because there are no input sections.  */
+   . = ALIGN(32 / 8);
+   __bss_end = .;
+  } > ram
+
+  . = ALIGN(16);
+  _HeapStart = . ;
+  . = . + _HeapSize ;
+  PROVIDE( _HeapEnd = . );
+
+  . = ALIGN(16);
+  _WorkSpaceStart = . ;
+  . = . + _WorkspaceSize ;
+  PROVIDE(_WorkSpaceEnd = .);
+
+  . = ALIGN(16);
+  .stack . : {
+     stack_start = .;
+     . = . + 4096;
+     stack_end = .;
+  }
+
+  . = ALIGN(16);
+  _CPU_Interrupt_stack_low  = . ;
+  _CPU_Interrupt_stack_high = _CPU_Interrupt_stack_low + 4096 ;
+
+  /* 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) }
+  .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) }
+  /* 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 : { _stack = .; *(.stack) }
+  /* These must appear regardless of  .  */
+}
