Index: c/src/lib/libbsp/m68k/dmv152/bsp_specs
===================================================================
--- c/src/lib/libbsp/m68k/dmv152/bsp_specs	(revision 69537ca9eccfa12142dea588fa34b70a6d220705)
+++ c/src/lib/libbsp/m68k/dmv152/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/dmv152/startup/linkcmds
===================================================================
--- c/src/lib/libbsp/m68k/dmv152/startup/linkcmds	(revision 69537ca9eccfa12142dea588fa34b70a6d220705)
+++ c/src/lib/libbsp/m68k/dmv152/startup/linkcmds	(revision b2b4835718515a377bcb82947bbd9890d7330aea)
@@ -13,61 +13,122 @@
  */
 
+/*
+ * Declare some sizes.
+ */
+HeapSize = DEFINED(HeapSize) ? HeapSize : 0x10000;
 StackSize = DEFINED(StackSize) ? StackSize : 0x1000;
 
 MEMORY
-        {
-        ram : org = 0x12800, l = 1M
-        }
+{
+	ram : org = 0x0, l = 1M
+}
 
 SECTIONS
 {
-        .text 0x12800 :
-        {
-        text_start = . ;
-        _text_start = . ;
-        *(.text)
-	. = ALIGN (16);
+	ram : {
+		. = 0x12800;
+	} >ram
 
-	*(.eh_fram)
-	. = ALIGN (16);
+        /*
+         * Text, data and bss segments
+         */
+        .text : {
+                *(.text)
 
-	. = ALIGN (16);
-	*(.gcc_exc)
+		/*
+		 * C++ constructors/destructors
+		 */
+		*(.gnu.linkonce.t.*)
 
-	/*
-	 * C++ constructors
-	 */
-	__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__ = .;
-        etext = ALIGN( 0x10 ) ;
-        _etext = .;
-        }
+		/*
+		 * 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 : {
-        	data_start = . ;
-        	_data_start = . ;
-        	*(.data)
-        	edata = ALIGN( 0x10 ) ;
-        	_edata = .;
-        }
+                copy_start = .;
+                *(.data)
+		*(.gnu.linkonce.d*)
+		*(.gcc_except_table)
+                . = ALIGN (16);
+                PROVIDE (_edata = .);
+                copy_end = .;
+        } >ram
         .bss : {
-        	bss_start = . ;
-        	_bss_start = . ;
-        	*(.bss)
-        	*(COMMON)
-		. += StackSize; /* XXX -- Old gld can't handle this */
-		. = ALIGN (16);
-		stack_init = .;
-        	end = . ;
-        	_end = . ;
-        }
+                bss_start = .;
+                . += (256 * 4);
+                clear_start = .;
+                *(.bss)
+                *(COMMON)
+                . = ALIGN (16);
+                PROVIDE (end = .);
+
+                . += StackSize;
+                PROVIDE (_stack_init = .);
+
+                . = ALIGN (16);
+                PROVIDE (_HeapStart = .);
+                . += HeapSize;
+                PROVIDE (_HeapEnd = .);
+
+                clear_end = .;
+
+                _WorkspaceBase = .;
+        } >ram
 }
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
 }
Index: c/src/lib/libbsp/m68k/efi68k/bsp_specs
===================================================================
--- c/src/lib/libbsp/m68k/efi68k/bsp_specs	(revision 69537ca9eccfa12142dea588fa34b70a6d220705)
+++ c/src/lib/libbsp/m68k/efi68k/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/efi68k/startup/linkcmds
===================================================================
--- c/src/lib/libbsp/m68k/efi68k/startup/linkcmds	(revision 69537ca9eccfa12142dea588fa34b70a6d220705)
+++ c/src/lib/libbsp/m68k/efi68k/startup/linkcmds	(revision b2b4835718515a377bcb82947bbd9890d7330aea)
@@ -48,66 +48,119 @@
 
 /*
+ * Declare some sizes.
+ */
+HeapSize = DEFINED(HeapSize) ? HeapSize : 0x10000;
+StackSize = DEFINED(StackSize) ? StackSize : 0x1000;
+
+/*
  * stick everything in ram (of course)
  */
+
 SECTIONS
 {
-  .text :
-  {
-    CREATE_OBJECT_SYMBOLS
-    text_start = .;
-    _text_start = .;
-    *(.text)
-    . = ALIGN (16);
-    *(.eh_fram)
-    . = ALIGN (16);
+	ram : {
+		. = .;
+	} >ram
 
-    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
-  .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 ]
-  }
+        /*
+         * Text, data and bss segments
+         */
+        .text : {
+                *(.text)
+
+		/*
+		 * C++ constructors/destructors
+		 */
+		*(.gnu.linkonce.t.*)
+
+		/*
+		 * 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
 }
Index: c/src/lib/libbsp/m68k/gen68302/bsp_specs
===================================================================
--- c/src/lib/libbsp/m68k/gen68302/bsp_specs	(revision 69537ca9eccfa12142dea588fa34b70a6d220705)
+++ c/src/lib/libbsp/m68k/gen68302/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/gen68302/startup/linkcmds
===================================================================
--- c/src/lib/libbsp/m68k/gen68302/startup/linkcmds	(revision 69537ca9eccfa12142dea588fa34b70a6d220705)
+++ c/src/lib/libbsp/m68k/gen68302/startup/linkcmds	(revision b2b4835718515a377bcb82947bbd9890d7330aea)
@@ -14,62 +14,123 @@
 
 MEMORY 
-	{
+{
 	ram : org = 0x0000, l = 16M
-	}
+}
 
 m302 = 0xf7f000;
 _VBR = 0x000000;		/* location of the VBR table (in RAM) */
 
+/*
+ * Declare some sizes.
+ */
+HeapSize = DEFINED(HeapSize) ? HeapSize : 0x10000;
+StackSize = DEFINED(StackSize) ? StackSize : 0x1000;
+
 SECTIONS
 {
-        .text 0xc00000 :
-	{
-	text_start = . ;
-        *(.text)
-	. = ALIGN (16);
-	*(.gnu.linkonce.t.*)
-	*(.descriptors)
-	/* .gnu.warning sections are handled specially by elf32.em.  */
-	*(.gnu.warning)
+	ram : {
+		. = 0xc00000;
+	} >ram
 
-	*(.eh_fram)
-	. = ALIGN (16);
+        /*
+         * Text, data and bss segments
+         */
+        .text : {
+                *(.text)
 
-	/*
-	 * C++ constructors
-	 */
-	__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__ = .;
+		/*
+		 * C++ constructors/destructors
+		 */
+		*(.gnu.linkonce.t.*)
 
-	_rodata_start = . ;
-	*(.rodata)
-	*(.gnu.linkonce.r*)
-	_erodata = ALIGN( 0x10 ) ;
+		/*
+		 * 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)
 
-	etext = ALIGN( 0x10 ) ;
-        } 
-        .data 0x010000 : 
-	{
-	data_start = . ;
-        *(.data)
-    	*(.gnu.linkonce.d.*)
-    	*(.gcc_except_table)
-	edata = ALIGN( 0x10 ) ;
-        }
-        .bss ADDR( .data ) + SIZEOF( .data ): 
-        {
-	bss_start = . ;
-	*(.bss)
-	*(COMMON)
-	end = . ;
-	_end = . ;
-	}  
+		/*
+		 * 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
 }
Index: c/src/lib/libbsp/m68k/gen68340/bsp_specs
===================================================================
--- c/src/lib/libbsp/m68k/gen68340/bsp_specs	(revision 69537ca9eccfa12142dea588fa34b70a6d220705)
+++ c/src/lib/libbsp/m68k/gen68340/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/gen68340/startup/linkcmds
===================================================================
--- c/src/lib/libbsp/m68k/gen68340/startup/linkcmds	(revision 69537ca9eccfa12142dea588fa34b70a6d220705)
+++ c/src/lib/libbsp/m68k/gen68340/startup/linkcmds	(revision b2b4835718515a377bcb82947bbd9890d7330aea)
@@ -25,7 +25,4 @@
 /*
  * Declare some sizes.
- * XXX: The assignment of ". += XyzSize;" fails in older gld's if the
- *      number used there is not constant.  If this happens to you, edit
- *      the lines marked XXX below to use a constant value.
  */
 RamSize = DEFINED(RamSize) ? RamSize : 4M;
@@ -80,35 +77,104 @@
          */
         .text : {
-                CREATE_OBJECT_SYMBOLS
                 *(.text)
-                . = ALIGN (16);
 
 		/*
-		 * C++ constructors
+		 * C++ constructors/destructors
 		 */
-		__CTOR_LIST__ = .;
-		LONG((__CTOR_END__ - __CTOR_LIST__) / 4 - 2)
+		*(.gnu.linkonce.t.*)
+
+		/*
+		 * 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)
-		LONG(0)
-		__CTOR_END__ = .;
-		__DTOR_LIST__ = .;
-		LONG((__DTOR_END__ - __DTOR_LIST__) / 4 - 2)
+		*crtend.o(.ctors)
+		*crtbegin.o(.dtors)
 		*(.dtors)
-		LONG(0)
-		__DTOR_END__ = .;
+		*crtend.o(.dtors)
 
-                etext = .;
-                _etext = .;
-        } >rom 
+		/*
+		 * Exception frame info
+		 */
+		. = ALIGN (16);
+		*(.eh_frame)
 
-	.eh_fram : {
+		/*
+		 * Read-only data
+		 */
 		. = ALIGN (16);
-		*(.eh_fram)
-	} >ram
+		_rodata_start = . ;
+		*(.rodata)
+		*(.gnu.linkonce.r*)
 
-	.gcc_exc : {
-		. = ALIGN (16);
-		*(.gcc_exc)
-	} >ram
+                 . = 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 : {
+		M68Kvec = .;
+		_M68Kvec = .;
+		. += (256 * 4);
+                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
 
        /*
@@ -122,34 +188,3 @@
         } >ram
 
-        .data : {
-                copy_start = .;
-                *(.data)
-                . = ALIGN (16);
-                _edata = .;
-                copy_end = .;
-        } >ram
-
-        .bss : {
-                M68Kvec = .;
-                _M68Kvec = .;
-                . += (256 * 4);
-                clear_start = .;
-                *(.bss)
-                *(COMMON)
-                . = ALIGN (16);
-                _end = .;
-
-                _HeapStart = .;
-                __HeapStart = .;
-                . += HeapSize;  /* XXX -- Old gld can't handle this */
-                . += StackSize; /* XXX -- Old gld can't handle this */
-                /* . += 0x10000; */ /* HeapSize for old gld */
-                /* . += 0x1000;  */ /* StackSize for old gld */
-                . = ALIGN (16);
-                stack_init = .;
-                clear_end = .;
-
-                _WorkspaceBase = .;
-                __WorkspaceBase = .;
-        } >ram
 }
Index: c/src/lib/libbsp/m68k/gen68360/bsp_specs
===================================================================
--- c/src/lib/libbsp/m68k/gen68360/bsp_specs	(revision 69537ca9eccfa12142dea588fa34b70a6d220705)
+++ c/src/lib/libbsp/m68k/gen68360/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/gen68360/startup/linkcmds
===================================================================
--- c/src/lib/libbsp/m68k/gen68360/startup/linkcmds	(revision 69537ca9eccfa12142dea588fa34b70a6d220705)
+++ c/src/lib/libbsp/m68k/gen68360/startup/linkcmds	(revision b2b4835718515a377bcb82947bbd9890d7330aea)
@@ -14,7 +14,4 @@
 /*
  * Declare some sizes.
- * XXX: The assignment of ". += XyzSize;" fails in older gld's if the
- *      number used there is not constant.  If this happens to you, edit
- *      the lines marked XXX below to use a constant value.
  */
 HeapSize = DEFINED(HeapSize) ? HeapSize : 0x10000;
@@ -39,5 +36,4 @@
         rom : {
                 _RomBase = .;
-                __RomBase = .;
         } >rom
 
@@ -47,5 +43,4 @@
         ram : {
                 _RamBase = .;
-                __RamBase = .;
         } >ram
 
@@ -54,31 +49,65 @@
          */
         .text : {
-                CREATE_OBJECT_SYMBOLS
                 *(.text)
-                . = ALIGN (16);
 
+		/*
+		 * C++ constructors/destructors
+		 */
 		*(.gnu.linkonce.t.*)
-		*(.descriptors)
-		/* .gnu.warning sections are handled specially by elf32.em.  */
-		*(.gnu.warning)
 
-		*(.eh_fram)
+		/*
+		 * 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)
 
-		*(.gcc_exc)
 		/*
-		 * C++ constructors
+		 * Exception frame info
 		 */
-		__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__ = .;
+		. = ALIGN (16);
+		*(.eh_frame)
 
+		/*
+		 * Read-only data
+		 */
+		. = ALIGN (16);
 		_rodata_start = . ;
 		*(.rodata)
@@ -86,7 +115,6 @@
 
                  . = ALIGN (16);
-                etext = .;
-                _etext = .;
-        } >ram 
+                PROVIDE (etext = .);
+        } >ram
         .data : {
                 copy_start = .;
@@ -95,5 +123,5 @@
 		*(.gcc_except_table)
                 . = ALIGN (16);
-                _edata = .;
+                PROVIDE (_edata = .);
                 copy_end = .;
         } >ram
@@ -106,18 +134,17 @@
                 *(COMMON)
                 . = ALIGN (16);
-                _end = .;
+                PROVIDE (end = .);
 
-                _HeapStart = .;
-                __HeapStart = .;
-                . += HeapSize;  /* XXX -- Old gld can't handle this */
-                . += StackSize; /* XXX -- Old gld can't handle this */
-                /* . += 0x10000; */ /* HeapSize for old gld */
-                /* . += 0x1000;  */ /* StackSize for old gld */
+                . += StackSize;
+                PROVIDE (_stack_init = .);
+
                 . = ALIGN (16);
-                stack_init = .;
+                PROVIDE (_HeapStart = .);
+                . += HeapSize;
+                PROVIDE (_HeapEnd = .);
+
                 clear_end = .;
 
                 _WorkspaceBase = .;
-                __WorkspaceBase = .;
         } >ram
 
Index: c/src/lib/libbsp/m68k/idp/bsp_specs
===================================================================
--- c/src/lib/libbsp/m68k/idp/bsp_specs	(revision 69537ca9eccfa12142dea588fa34b70a6d220705)
+++ c/src/lib/libbsp/m68k/idp/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/idp/startup/linkcmds
===================================================================
--- c/src/lib/libbsp/m68k/idp/startup/linkcmds	(revision 69537ca9eccfa12142dea588fa34b70a6d220705)
+++ c/src/lib/libbsp/m68k/idp/startup/linkcmds	(revision b2b4835718515a377bcb82947bbd9890d7330aea)
@@ -13,6 +13,4 @@
  */
 
-StackSize = DEFINED(StackSize) ? StackSize : 0x1000;
-
 MEMORY 
 {
@@ -20,52 +18,116 @@
 }
 
+/*
+ * Declare some sizes.
+ */
+HeapSize = DEFINED(HeapSize) ? HeapSize : 0x10000;
+StackSize = DEFINED(StackSize) ? StackSize : 0x1000;
+
 SECTIONS
 {
-    .text 0x10000:  
-    {
-        text_start = . ;
-        _text_start = . ;
-        *(.text)
-	. = ALIGN (16);
+	ram : {
+		. = .;
+	} >ram
 
-	*(.eh_fram)
-	. = ALIGN (16);
+        /*
+         * Text, data and bss segments
+         */
+        .text : {
+                *(.text)
 
-	. = ALIGN (16);
-	*(.gcc_exc)
+		/*
+		 * C++ constructors/destructors
+		 */
+		*(.gnu.linkonce.t.*)
 
-	/*
-	 * C++ constructors
-	 */
-	__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__ = .;
-        etext = ALIGN( 0x10 ) ;
-        _etext = .;
-    } 
-    .data : {
-        data_start = . ;
-        _data_start = .;
-        *(.data)
-        edata = ALIGN( 0x10 ) ;
-        _edata = .;
-    }
-    .bss : {
-        bss_start = . ;
-        _bss_start = . ;
-        *(.bss)
-        *(COMMON)
-	. += StackSize; /* XXX -- Old gld can't handle this */
-	. = ALIGN (16);
-	stack_init = .;
-        end = . ;
-        _end = . ;
-    }  
+		/*
+		 * 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
 }
Index: c/src/lib/libbsp/m68k/mvme136/bsp_specs
===================================================================
--- c/src/lib/libbsp/m68k/mvme136/bsp_specs	(revision 69537ca9eccfa12142dea588fa34b70a6d220705)
+++ c/src/lib/libbsp/m68k/mvme136/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/mvme136/startup/linkcmds
===================================================================
--- c/src/lib/libbsp/m68k/mvme136/startup/linkcmds	(revision 69537ca9eccfa12142dea588fa34b70a6d220705)
+++ c/src/lib/libbsp/m68k/mvme136/startup/linkcmds	(revision b2b4835718515a377bcb82947bbd9890d7330aea)
@@ -13,55 +13,121 @@
  */
 
+/*
+ * Declare some sizes.
+ */
+HeapSize = DEFINED(HeapSize) ? HeapSize : 0x10000;
 StackSize = DEFINED(StackSize) ? StackSize : 0x1000;
+
 MEMORY
-	{
-	ram : org = 0x3000, l = 1M
-	}
+{
+	ram : org = 0x0, l = 1M
+}
 
 SECTIONS
 {
-        .text 0x3000 :
-	{
-	    text_start = . ;
-	    _text_start = . ;
-            *(.text)
-	    . = ALIGN (16);
+	ram : {
+		. = 0x3000;
+	} >ram
 
-	    *(.eh_fram)
-	    . = ALIGN (16);
+        /*
+         * Text, data and bss segments
+         */
+        .text : {
+                *(.text)
 
-	    /*
-	     * C++ constructors
-	     */
-	    __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__ = .;
-	    etext = ALIGN( 0x10 ) ;
-	    _etext = .;
-        }
+		/*
+		 * C++ constructors/destructors
+     		 *
+     		 * 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. 
+		 */
+		*(.gnu.linkonce.t.*)
+
+		/*
+		 * Initialization and finalization code.
+     		 *
+     		 * 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.
+		 */
+		PROVIDE (_init = .);
+		*crti.o(.init)
+		*(.init)
+		*crtn.o(.init)
+		PROVIDE (_fini = .);
+		*crti.o(.fini)
+		*(.fini)
+		*crtn.o(.fini)
+
+		/*
+		 * C++ constructors/destructors
+		 */
+		. = 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 : {
-	    data_start = . ;
-            _data_start = .;
-            *(.data)
-	    edata = ALIGN( 0x10 ) ;
-            _edata = .;
-        }
+                PROVIDE (_copy_start = .);
+                *(.data)
+		*(.gnu.linkonce.d*)
+		*(.gcc_except_table)
+                . = ALIGN (16);
+                PROVIDE (_edata = .);
+                PROVIDE (_copy_end = .);
+        } >ram
         .bss : {
-	    bss_start = . ;
-	    _bss_start = . ;
-	    *(.bss)
-	    *(COMMON)
-                . += StackSize; /* XXX -- Old gld can't handle this */
+                PROVIDE (_bss_start = .);
+                PROVIDE (_clear_start = .);
+                *(.bss)
+                *(COMMON)
                 . = ALIGN (16);
-                stack_init = .;
-	    end = . ;
-	    _end = . ;
-	}
+                PROVIDE (end = .);
+
+                . += StackSize;
+                PROVIDE (_stack_init = .);
+
+                . = ALIGN (16);
+                PROVIDE (_HeapStart = .);
+                . += HeapSize;
+                PROVIDE (_HeapEnd = .);
+
+                clear_end = .;
+
+                PROVIDE (_WorkspaceBase = .);
+        } >ram
 }
Index: c/src/lib/libbsp/m68k/mvme147/bsp_specs
===================================================================
--- c/src/lib/libbsp/m68k/mvme147/bsp_specs	(revision 69537ca9eccfa12142dea588fa34b70a6d220705)
+++ c/src/lib/libbsp/m68k/mvme147/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/mvme147/startup/linkcmds
===================================================================
--- c/src/lib/libbsp/m68k/mvme147/startup/linkcmds	(revision 69537ca9eccfa12142dea588fa34b70a6d220705)
+++ c/src/lib/libbsp/m68k/mvme147/startup/linkcmds	(revision b2b4835718515a377bcb82947bbd9890d7330aea)
@@ -17,56 +17,121 @@
  */
 
+/*
+ * Declare some sizes.
+ */
+HeapSize = DEFINED(HeapSize) ? HeapSize : 0x10000;
 StackSize = DEFINED(StackSize) ? StackSize : 0x1000;
 
 MEMORY
-	{
-	ram : org = 0x5000, l = 0x3fafff
-	}
+{
+	ram : org = 0x0, l = 0x400000
+}
 
 SECTIONS
 {
-        .text 0x5000 :
-	{
-	    text_start = . ;
-	    _text_start = . ;
-            *(.text)
-	    . = ALIGN (16);
+	ram : {
+		. = 0x5000;
+	} >ram
 
-	    *(.eh_fram)
-	    . = ALIGN (16);
+        /*
+         * Text, data and bss segments
+         */
+        .text : {
+                *(.text)
 
-	    /*
-	     * C++ constructors
-	     */
-	    __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__ = .;
-	    etext = ALIGN( 0x10 ) ;
-	    _etext = .;
-        }
+		/*
+		 * C++ constructors/destructors
+		 */
+		*(.gnu.linkonce.t.*)
+
+		/*
+		 * 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 : {
-	    data_start = . ;
-            _data_start = .;
-            *(.data)
-	    edata = ALIGN( 0x10 ) ;
-            _edata = .;
-        }
+                PROVIDE (_copy_start = .);
+                *(.data)
+		*(.gnu.linkonce.d*)
+		*(.gcc_except_table)
+                . = ALIGN (16);
+                PROVIDE (_edata = .);
+                PROVIDE (_copy_end = .);
+        } >ram
         .bss : {
-	    bss_start = . ;
-	    _bss_start = . ;
-	    *(.bss)
-	    *(COMMON)
-	    . += StackSize; /* XXX -- Old gld can't handle this */
-	    . = ALIGN (16);
-	    stack_init = .;
-	    end = . ;
-	    _end = . ;
-	}
+                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
 }
Index: c/src/lib/libbsp/m68k/mvme147s/bsp_specs
===================================================================
--- c/src/lib/libbsp/m68k/mvme147s/bsp_specs	(revision 69537ca9eccfa12142dea588fa34b70a6d220705)
+++ c/src/lib/libbsp/m68k/mvme147s/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/mvme147s/startup/linkcmds
===================================================================
--- c/src/lib/libbsp/m68k/mvme147s/startup/linkcmds	(revision 69537ca9eccfa12142dea588fa34b70a6d220705)
+++ c/src/lib/libbsp/m68k/mvme147s/startup/linkcmds	(revision b2b4835718515a377bcb82947bbd9890d7330aea)
@@ -17,71 +17,121 @@
  */
 
+/*
+ * Declare some sizes.
+ */
+HeapSize = DEFINED(HeapSize) ? HeapSize : 0x10000;
 StackSize = DEFINED(StackSize) ? StackSize : 0x1000;
 
 MEMORY
-	{
-	ram : org = 0x7000, l = 0x3d8fff
-	}
+{
+	ram : org = 0x0, l = 0x400000
+}
 
 SECTIONS
 {
-        .text 0x7000 :
-	{
-	    text_start = . ;
-	    _text_start = . ;
-            *(.text)
-	    . = ALIGN (16);
+	ram : {
+		. = 0x7000;
+	} >ram
 
-            *(.gnu.linkonce.t.*)
-            *(.descriptors)
-            /* .gnu.warning sections are handled specially by elf32.em.  */
-            *(.gnu.warning)
+        /*
+         * Text, data and bss segments
+         */
+        .text : {
+                *(.text)
 
-	    *(.eh_fram)
-	    . = ALIGN (16);
+		/*
+		 * C++ constructors/destructors
+		 */
+		*(.gnu.linkonce.t.*)
 
-	    /*
-	     * C++ constructors
-	     */
-	    __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__ = .;
+		/*
+		 * 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)
 
-            _rodata_start = . ;
-            *(.rodata)
-            *(.gnu.linkonce.r*)
-            _erodata = ALIGN( 0x10 ) ;
+		/*
+		 * 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)
 
-	    etext = ALIGN( 0x10 ) ;
-	    _etext = .;
-        }
-        .data ADDR( .text ) + SIZEOF( .text ):
-	{
-	    data_start = . ;
-            _data_start = .;
-            *(.data)
-            *(.gnu.linkonce.d*)
-            *(.gcc_except_table)
-	    edata = ALIGN( 0x10 ) ;
-            _edata = .;
-        }
-        .bss ADDR( .data ) + SIZEOF( .data ):
-        {
-	    bss_start = . ;
-	    _bss_start = . ;
-	    *(.bss)
-	    *(COMMON)
-	    . += StackSize; /* XXX -- Old gld can't handle this */
-	    . = ALIGN (16);
-	    stack_init = .;
-	    end = . ;
-	    _end = . ;
-	}
+		/*
+		 * 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
 }
Index: c/src/lib/libbsp/m68k/mvme162/bsp_specs
===================================================================
--- c/src/lib/libbsp/m68k/mvme162/bsp_specs	(revision 69537ca9eccfa12142dea588fa34b70a6d220705)
+++ c/src/lib/libbsp/m68k/mvme162/bsp_specs	(revision b2b4835718515a377bcb82947bbd9890d7330aea)
@@ -20,7 +20,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/mvme162/startup/linkcmds
===================================================================
--- c/src/lib/libbsp/m68k/mvme162/startup/linkcmds	(revision 69537ca9eccfa12142dea588fa34b70a6d220705)
+++ c/src/lib/libbsp/m68k/mvme162/startup/linkcmds	(revision b2b4835718515a377bcb82947bbd9890d7330aea)
@@ -20,51 +20,121 @@
  */
 
+/*
+ * Declare some sizes.
+ */
+HeapSize = DEFINED(HeapSize) ? HeapSize : 0x10000;
 StackSize = DEFINED(StackSize) ? StackSize : 0x1000;
 
 MEMORY
-        {
+{
         ram : org = 0x100000, l = 1M
-        }
+}
 
 SECTIONS
 {
-        .text 0x100000 :
-        {
-        text_start = . ;
-        *(.text)
-	. = ALIGN (16);
+	ram : {
+		. = .;
+	} >ram
 
-	*(.eh_fram)
-	. = ALIGN (16);
+        /*
+         * Text, data and bss segments
+         */
+        .text : {
+                *(.text)
 
-	/*
-	 * C++ constructors
-	 */
-	__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__ = .;
-        etext = ALIGN( 0x10 ) ;
-        }
+		/*
+		 * C++ constructors/destructors
+		 */
+		*(.gnu.linkonce.t.*)
+
+		/*
+		 * 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 : {
-        data_start = . ;
-        *(.data)
-        edata = ALIGN( 0x10 ) ;
-        }
+                PROVIDE (_copy_start = .);
+                *(.data)
+		*(.gnu.linkonce.d*)
+		*(.gcc_except_table)
+                . = ALIGN (16);
+                PROVIDE (_edata = .);
+                PROVIDE (_copy_end = .);
+        } >ram
         .bss : {
-        bss_start = . ;
-        *(.bss)
-        *(COMMON)
-        . += StackSize; /* XXX -- Old gld can't handle this */
-        . = ALIGN (16);
-        stack_init = .;
-        end = . ;
-        _end = . ;
-        }
+                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
 }
Index: c/src/lib/libbsp/m68k/mvme167/bsp_specs
===================================================================
--- c/src/lib/libbsp/m68k/mvme167/bsp_specs	(revision 69537ca9eccfa12142dea588fa34b70a6d220705)
+++ c/src/lib/libbsp/m68k/mvme167/bsp_specs	(revision b2b4835718515a377bcb82947bbd9890d7330aea)
@@ -21,7 +21,11 @@
 %{!qrtems: %(old_startfile)} %{qrtems: \
 %{!qrtems_debug: start.o%s} \
-%{qrtems_debug: start_g.o%s} %{qelf crti.o%s crtbegin.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/mvme167/startup/linkcmds
===================================================================
--- c/src/lib/libbsp/m68k/mvme167/startup/linkcmds	(revision 69537ca9eccfa12142dea588fa34b70a6d220705)
+++ c/src/lib/libbsp/m68k/mvme167/startup/linkcmds	(revision b2b4835718515a377bcb82947bbd9890d7330aea)
@@ -30,7 +30,4 @@
 /*
  * Declare some sizes.
- * XXX: The assignment of ". += XyzSize;" fails in older gld's if the
- *      number used there is not constant.  If this happens to you, edit
- *      the lines marked XXX below to use a constant value.
  */
 HeapSize = DEFINED(HeapSize) ? HeapSize : 0x10000;
@@ -50,174 +47,107 @@
 SECTIONS
 {
-  /* 
-   * We want the entry point to be the first thing in memory.
-   * Merge all read-only data into the .text section.
-   */
-  .text 0x00800000 :
-  {
-    text_start = . ;
-    
-    *(.text)
-    *(.text.*)
-    *(.stub)
+	ram : {
+		. = .;
+	} >ram
 
-    /* C++ constructors/destructors */
-    *(.gnu.linkonce.t*)
-   
-    /* 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(.init)
-    
-    . = ALIGN (16);
-    
-    /* C++ constructors and destructors for static objects.
-     *
-     * 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.
-     */
-    PROVIDE (__CTOR_LIST__ = .);
-    *crtbegin.o(.ctors)
-    *(.ctors)
-    *crtend.o(.ctors)
-    PROVIDE (__CTOR_END__ = .);
+        /*
+         * Text, data and bss segments
+         */
+        .text : {
+                *(.text)
 
-    PROVIDE (__DTOR_LIST__ = .);
-    *crtbegin.o(.dtors)
-    *(.dtors)
-    *crtend.o(.dtors)
-    PROVIDE (__DTOR_END__ = .);
-    
-    . = ALIGN (16);
-    
-    /* Exception frame info */
-    *(.eh_frame)
-    
-    . = ALIGN (16);
+		/*
+		 * C++ constructors/destructors
+		 */
+		*(.gnu.linkonce.t.*)
 
-    /* Do we have any of these with egcs-1.x and higher? */
-    *(.gcc_exc)
-    
-    . = ALIGN (16);
-		
-    _rodata_start = . ;
-    *(.rodata)
-    *(.rodata.*)
-    *(.gnu.linkonce.r*)
-    *(.rodata1)    
-    _erodata = .;
+		/*
+		 * 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)
 
-    _etext = .;
-    PROVIDE (etext = .);
-       
-  } >ram =0x4e75
- 
-  . = ALIGN (16);
-  
-  .data :
-  {
-    data_start = .;
-    
-    *(.data)
-    *(.data.*)
-    *(.data1)
-    *(.sdata)
-    *(.gnu.linkonce.d*)
-    *(.gcc_except_table)
-    
-    . = ALIGN (16); 
-    _edata = .;
-    PROVIDE (edata = .); 
-  } >ram
+		/*
+		 * 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)
 
-  .bss :
-  {
-    bss_start = .;
-    *(.dynbss)
-    *(.bss)
-    *(COMMON)
-    *(.sbss)
-    *(.scommon)  
-    
-    . = ALIGN (16);
-    _end = .;
-    PROVIDE (end = .); 
-  } >ram
+		/*
+		 * Exception frame info
+		 */
+		. = ALIGN (16);
+		*(.eh_frame)
 
-  _HeapStart	= .;
-  . += HeapSize;	/* XXX -- Old gld can't	handle this	*/
-  _HeapEnd = .;
-  _StackStart = .;
-  . += StackSize;	/* XXX -- Old gld can't	handle this	*/
-  /* . +=	0x10000; */	/* HeapSize	for	old	gld	*/
-  /* . +=	0x1000;	 */	/* StackSize for old gld */
-  . =	ALIGN (16);
-  _StackEnd = .;
-  stack_init = .;
-  clear_end =	.;
+		/*
+		 * Read-only data
+		 */
+		. = ALIGN (16);
+		_rodata_start = . ;
+		*(.rodata)
+		*(.gnu.linkonce.r*)
 
-  _WorkspaceBase	= .;
+                 . = 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 = .);
 
-  /* 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) }
-  /* These must appear regardless of  .  */
+                . += StackSize;
+                PROVIDE (_stack_init = .);
+
+                . = ALIGN (16);
+		PROVIDE (_HeapStart = .);
+		. += HeapSize;
+		PROVIDE (_HeapEnd = .);
+                PROVIDE (_clear_end = .);
+
+                PROVIDE (_WorkspaceBase = .);
+        } >ram
 }
-
Index: c/src/lib/libbsp/m68k/ods68302/bsp_specs
===================================================================
--- c/src/lib/libbsp/m68k/ods68302/bsp_specs	(revision 69537ca9eccfa12142dea588fa34b70a6d220705)
+++ c/src/lib/libbsp/m68k/ods68302/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/ods68302/startup/linkcmds
===================================================================
--- c/src/lib/libbsp/m68k/ods68302/startup/linkcmds	(revision 69537ca9eccfa12142dea588fa34b70a6d220705)
+++ c/src/lib/libbsp/m68k/ods68302/startup/linkcmds	(revision b2b4835718515a377bcb82947bbd9890d7330aea)
@@ -6,50 +6,131 @@
  */
 
+/*
+ * Declare some sizes.
+ */
+HeapSize = DEFINED(HeapSize) ? HeapSize : 0x10000;
+StackSize = DEFINED(StackSize) ? StackSize : 0x1000;
+
+/*
+ * Declare on-board memory.
+ */
+MEMORY {
+          ram : ORIGIN = 0x00000000, LENGTH = 1M
+}
 SECTIONS
 {
-  .vtable 0 :
-  {
-    vtable_start = .;
-    *(.vtable)
-    evtable = .;
-  }
+	ram : {
+		. = .;
+	} >ram
 
-  .text . :
-  {
-    text_start = .;
-    *(.text)
-    . = ALIGN (16);
+	.vtable :
+	{
+		vtable_start = .;
+		*(.vtable)
+		evtable = .;
+	} >ram
 
-    *(.eh_fram)
-    . = ALIGN (16);
 
-    etext = .;
-    . = ALIGN(4);
-    __CTOR_LIST__ = .;
-    LONG((__CTOR_END__ - __CTOR_LIST__) / 4 - 2)
-    *(.ctors)
-    LONG(0)
-    __CTOR_END__ = .;
-    . = ALIGN(4);
-    __DTOR_LIST__ = .;
-    LONG((__DTOR_END__ - __DTOR_LIST__) / 4 - 2)
-    *(.dtors)
-    LONG(0)
-    __DTOR_END__ = .;
-  }
-  
-  .data : {
-    data_start = .;
-    *(.data)
-    *(.rodata)
-    edata = .;
-  }
-  .bss : {
-    bss_start = .;
-    *(.bss)
-    *(COMMON)
-    end = . ;
-    _end = . ;
-  }  
+        /*
+         * Text, data and bss segments
+         */
+        .text : {
+                *(.text)
+
+		/*
+		 * C++ constructors/destructors
+		 */
+		*(.gnu.linkonce.t.*)
+
+		/*
+		 * 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
 }
 
