-
-/* 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
{
{
. = 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 :
{
. = 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 = . ;
{
PROVIDE (__vectors_start = .) ;
*(.vectors*)
+ KEEP(*(.vectors*))
_vectors_end = . ;
} > vectors
/* Stabs for profiling information*/
.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)) ;