Now works with more modern compiler; fixed linking script.
[goodfet] / firmware / ldscripts / 161x.x
index fdcba1b..8956093 100644 (file)
@@ -1,23 +1,14 @@
-
-/* Extra-neighborly linking script, targetting the MSP430F1611 and F1612.
-   by Travis Goodspeed
-   <travis at radiantmachines.com>
-*/
-/* Space from 0x2500 to 0x4000 (5K) is RAM on the 1611, flash on the 1612.
-   It is unused here, but it might be used as a buffer or something through
-   pointer referencing.
-*/
-
+/* Default linker script, for normal executables */
 OUTPUT_FORMAT("elf32-msp430","elf32-msp430","elf32-msp430")
 OUTPUT_ARCH(msp:16)
 MEMORY
 {
-  text   (rx)          : ORIGIN = 0x4000,      LENGTH = 0xbfe0
-  data   (rwx)         : ORIGIN = 0x1100,      LENGTH = 0x1400
-  vectors (rw)         : ORIGIN = 0xffe0,      LENGTH = 0x20
-  bootloader(rx)       : ORIGIN = 0x0c00,      LENGTH = 1K
-  infomem(rx)          : ORIGIN = 0x1000,      LENGTH = 256
-  infomemnobits(rx)    : ORIGIN = 0x1000,      LENGTH = 256
+  text   (rx)       : ORIGIN = 0x4000,     LENGTH = 0xbfe0
+  data   (rwx)      : ORIGIN = 0x1100,     LENGTH = 0x1400
+  vectors (rw)      : ORIGIN = 0xffe0,     LENGTH = 32
+  bootloader(rx)    : ORIGIN = 0x0c00,     LENGTH = 1K
+  infomem(rx)       : ORIGIN = 0x1000,     LENGTH = 256
+  infomemnobits(rx) : ORIGIN = 0x1000,     LENGTH = 256
 }
 SECTIONS
 {
@@ -83,50 +74,77 @@ SECTIONS
   {
     . = ALIGN(2);
     *(.init)
-    *(.init0)  /* Start here after reset.  */
-    *(.init1)
-    *(.init2)  /* Copy data loop  */
-    *(.init3)
-    *(.init4)  /* Clear bss  */
-    *(.init5)
-    *(.init6)  /* C++ constructors.  */
-    *(.init7)
-    *(.init8)
-    *(.init9)  /* Call main().  */
+    KEEP(*(.init))
+    *(.init0)  /* Start here after reset.               */
+    KEEP(*(.init0))
+    *(.init1)  /* User definable.                       */
+    KEEP(*(.init1))
+    *(.init2)  /* Initialize stack.                     */
+    KEEP(*(.init2))
+    *(.init3)  /* Initialize hardware, user definable.  */
+    KEEP(*(.init3))
+    *(.init4)  /* Copy data to .data, clear bss.        */
+    KEEP(*(.init4))
+    *(.init5)  /* User definable.                       */
+    KEEP(*(.init5))
+    *(.init6)  /* C++ constructors.                     */
+    KEEP(*(.init6))
+    *(.init7)  /* User definable.                       */
+    KEEP(*(.init7))
+    *(.init8)  /* User definable.                       */
+    KEEP(*(.init8))
+    *(.init9)  /* Call main().                          */
+    KEEP(*(.init9))
      __ctors_start = . ;
      *(.ctors)
+     KEEP(*(.ctors))
      __ctors_end = . ;
      __dtors_start = . ;
      *(.dtors)
+     KEEP(*(.dtors))
      __dtors_end = . ;
     . = ALIGN(2);
     *(.text)
     . = ALIGN(2);
     *(.text.*)
     . = ALIGN(2);
-    *(.fini9)  /*   */
-    *(.fini8)
-    *(.fini7)
-    *(.fini6)  /* C++ destructors.  */
-    *(.fini5)
-    *(.fini4)
-    *(.fini3)
-    *(.fini2)
-    *(.fini1)
+    *(.fini9)  /* Jumps here after main(). User definable.  */
+    KEEP(*(.fini9))
+    *(.fini8)  /* User definable.                           */
+    KEEP(*(.fini8))
+    *(.fini7)  /* User definable.                           */
+    KEEP(*(.fini7))
+    *(.fini6)  /* C++ destructors.                          */
+    KEEP(*(.fini6))
+    *(.fini5)  /* User definable.                           */
+    KEEP(*(.fini5))
+    *(.fini4)  /* User definable.                           */
+    KEEP(*(.fini4))
+    *(.fini3)  /* User definable.                           */
+    KEEP(*(.fini3))
+    *(.fini2)  /* User definable.                           */
+    KEEP(*(.fini2))
+    *(.fini1)  /* User definable.                           */
+    KEEP(*(.fini1))
     *(.fini0)  /* Infinite loop after program termination.  */
+    KEEP(*(.fini0))
     *(.fini)
+    KEEP(*(.fini))
     _etext = .;
   }  > text
-  .data   : AT (ADDR (.text) + SIZEOF (.text))
+  .data   :
   {
      PROVIDE (__data_start = .) ;
     . = ALIGN(2);
     *(.data)
+    *(SORT_BY_ALIGNMENT(.data.*))
     . = ALIGN(2);
     *(.gnu.linkonce.d*)
     . = ALIGN(2);
      _edata = . ;
-  }  > data
+  }  > data AT > text
+    PROVIDE (__data_load_start = LOADADDR(.data) );
+    PROVIDE (__data_size = SIZEOF(.data) );
   /* Bootloader.  */
   .bootloader   :
   {
@@ -149,18 +167,21 @@ SECTIONS
     . = ALIGN(2);
     *(.infomemnobits.*)
   }  > infomemnobits
-  .bss  SIZEOF(.data) + ADDR(.data) :
+  .bss   :
   {
      PROVIDE (__bss_start = .) ;
     *(.bss)
+    *(SORT_BY_ALIGNMENT(.bss.*))
     *(COMMON)
      PROVIDE (__bss_end = .) ;
      _end = . ;
   }  > data
-  .noinit  SIZEOF(.bss) + ADDR(.bss) :
+    PROVIDE (__bss_size = SIZEOF(.bss) );
+  .noinit   :
   {
      PROVIDE (__noinit_start = .) ;
     *(.noinit)
+    *(.noinit.*)
     *(COMMON)
      PROVIDE (__noinit_end = .) ;
      _end = . ;
@@ -169,6 +190,7 @@ SECTIONS
   {
      PROVIDE (__vectors_start = .) ;
     *(.vectors*)
+    KEEP(*(.vectors*))
      _vectors_end = . ;
   }  > vectors
   /* Stabs for profiling information*/
@@ -201,7 +223,10 @@ SECTIONS
   .debug_str      0 : { *(.debug_str) }
   .debug_loc      0 : { *(.debug_loc) }
   .debug_macinfo  0 : { *(.debug_macinfo) }
-  PROVIDE (__stack = 0x2500) ;
+  /* DWARF 3 */
+  .debug_pubtypes 0 : { *(.debug_pubtypes) }
+  .debug_ranges   0 : { *(.debug_ranges) }
+  PROVIDE (__stack = 0x3900) ;
   PROVIDE (__data_start_rom = _etext) ;
   PROVIDE (__data_end_rom   = _etext + SIZEOF (.data)) ;
   PROVIDE (__noinit_start_rom = _etext + SIZEOF (.data)) ;