Index: c/src/lib/libbsp/m68k/efi332/bsp_specs
===================================================================
--- c/src/lib/libbsp/m68k/efi332/bsp_specs	(revision 69537ca9eccfa12142dea588fa34b70a6d220705)
+++ c/src/lib/libbsp/m68k/efi332/bsp_specs	(revision b2b4835718515a377bcb82947bbd9890d7330aea)
@@ -17,7 +17,11 @@
 %{!qrtems: %(old_startfile)} %{qrtems: \
 %{!qrtems_debug: start.o%s} \
-%{qrtems_debug: start_g.o%s}}
+%{qrtems_debug: start_g.o%s} \
+crti.o%s crtbegin.o%s}
 
 *link:
 %{!qrtems: %(old_link)} %{qrtems: -dc -dp -N -e start}
 
+*endfile:
+%{!qrtems: %(old_endfile)} %{qrtems: crtend.o%s crtn.o%s}
+
Index: c/src/lib/libbsp/m68k/efi332/startup/linkcmds
===================================================================
--- c/src/lib/libbsp/m68k/efi332/startup/linkcmds	(revision 69537ca9eccfa12142dea588fa34b70a6d220705)
+++ c/src/lib/libbsp/m68k/efi332/startup/linkcmds	(revision b2b4835718515a377bcb82947bbd9890d7330aea)
@@ -31,4 +31,10 @@
  */
 
+/*
+ * Declare some sizes.
+ */
+HeapSize = DEFINED(HeapSize) ? HeapSize : 0x10000;
+StackSize = DEFINED(StackSize) ? StackSize : 0x1000;
+
 MEMORY
 {
@@ -44,68 +50,108 @@
 SECTIONS
 {
-  .text :
-  {
-    CREATE_OBJECT_SYMBOLS
-    text_start = .;
-    _text_start = .;
+	ram : {
+		. = .;
+	} >ram
 
-    *(.text)
-    . = ALIGN (16);
+        /*
+         * Text, data and bss segments
+         */
+        .text : {
+                *(.text)
 
-    *(.eh_fram)
-    . = ALIGN (16);
+		/*
+		 * C++ constructors/destructors
+		 */
+		*(.gnu.linkonce.t.*)
 
-    etext = ALIGN(0x10);
-    _etext = .;
-    __CTOR_LIST__ = .;
-    LONG((__CTOR_END__ - __CTOR_LIST__) / 4 - 2)
-    *(.ctors)
-    LONG(0)
-    __CTOR_END__ = .;
-    __DTOR_LIST__ = .;
-    LONG((__DTOR_END__ - __DTOR_LIST__) / 4 - 2)
-    *(.dtors)
-    LONG(0)
-    __DTOR_END__ = .;
-    *(.lit)
-    *(.shdata)
-    _endtext = .;
-  } > ram
-  .gcc_exc :
-  {
-    *(.gcc_exc)
-  } > ram
-  .data :
-  {
-    data_start = .;
-    _data_start = .;
-    _sdata = . ;
-    *(.data)
-    CONSTRUCTORS
-    edata = ALIGN(0x10);
-    _edata = .;
-  } > ram
-  .shbss :
-  {
-    *(.shbss)
-  } > ram
-  .bss :
-  {
-    __bss_start = ALIGN(0x8);
-    bss_start = .;
-    _bss_start = .;
-    *(.bss)
-    *(COMMON)
-    end = .;
-    _end = ALIGN(0x8);
-    __end = ALIGN(0x8);
-  } > ram
-  .stab . (NOLOAD) :
-  {
-    [ .stab ]
-  }
-  .stabstr . (NOLOAD) :
-  {
-    [ .stabstr ]
-  }
+		/*
+		 * Initialization and finalization code.
+     		 *
+     		 * Various files can provide initialization and finalization
+		 * functions.  crtbegin.o and crtend.o are two instances. The
+		 * body of these functions are in .init and .fini sections. We
+		 * accumulate the bodies here, and prepend function prologues
+		 * from crti.o and function epilogues from crtn.o. crti.o must
+		 * be linked first; crtn.o must be linked last.  Because these
+		 * are wildcards, it doesn't matter if the user does not
+		 * actually link against crti.o and crtn.o; the linker won't
+		 * look for a file to match a wildcard.  The wildcard also
+		 * means that it doesn't matter which directory crti.o and
+		 * crtn.o are in. 
+		 */
+		PROVIDE (_init = .);
+		*crti.o(.init)
+		*(.init)
+		*crtn.o(.init)
+		PROVIDE (_fini = .);
+		*crti.o(.fini)
+		*(.fini)
+		*crtn.o(.fini)
+
+		/*
+		 * C++ constructors/destructors
+     		 *
+     		 * gcc uses crtbegin.o to find the start of the constructors
+		 * and destructors 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. The
+		 * constructor and destructor list are terminated in
+		 * crtend.o.  The same comments apply to it.
+		 */
+		. = ALIGN (16);
+		*crtbegin.o(.ctors)
+		*(.ctors)
+		*crtend.o(.ctors)
+		*crtbegin.o(.dtors)
+		*(.dtors)
+		*crtend.o(.dtors)
+
+		/*
+		 * Exception frame info
+		 */
+		. = ALIGN (16);
+		*(.eh_frame)
+
+		/*
+		 * Read-only data
+		 */
+		. = ALIGN (16);
+		_rodata_start = . ;
+		*(.rodata)
+		*(.gnu.linkonce.r*)
+
+                 . = ALIGN (16);
+                PROVIDE (_etext = .);
+        } >ram
+        .data : {
+                PROVIDE (_copy_start = .);
+                *(.data)
+		*(.gnu.linkonce.d*)
+		*(.gcc_except_table)
+                . = ALIGN (16);
+                PROVIDE (_edata = .);
+                PROVIDE (_copy_end = .);
+        } >ram
+        .bss : {
+                PROVIDE (_bss_start = .);
+                PROVIDE (_clear_start = .);
+                *(.bss)
+                *(COMMON)
+                . = ALIGN (16);
+                PROVIDE (end = .);
+
+                . += StackSize;
+                PROVIDE (_stack_init = .);
+
+                . = ALIGN (16);
+                PROVIDE (_HeapStart = .);
+                . += HeapSize;
+                PROVIDE (_HeapEnd = .);
+
+                clear_end = .;
+
+                PROVIDE (_WorkspaceBase = .);
+        } >ram
 }
