--- /dev/null
+MEMORY {
+ sfr : ORIGIN = 0x0000, LENGTH = 0x0010 /* END=0x0010, size 16 */
+ peripheral_8bit : ORIGIN = 0x0010, LENGTH = 0x00f0 /* END=0x0100, size 240 */
+ peripheral_16bit : ORIGIN = 0x0100, LENGTH = 0x0100 /* END=0x0200, size 256 */
+ ram (wx) : ORIGIN = 0x0200, LENGTH = 0x2000 /* END=0x2100, size 8K */
+ infomem : ORIGIN = 0x1000, LENGTH = 0x0100 /* END=0x1100, size 256 */
+ infob : ORIGIN = 0x1000, LENGTH = 0x0080 /* END=0x1080, size 128 */
+ infoa : ORIGIN = 0x1080, LENGTH = 0x0080 /* END=0x1100, size 128 */
+ rom (rx) : ORIGIN = 0x8000, LENGTH = 0x7fe0 /* END=0xffe0, size 32K */
+ vectors : ORIGIN = 0xffe0, LENGTH = 0x0020 /* END=0x10000, size 32 */
+ /* Remaining banks are absent */
+ bsl : ORIGIN = 0x0000, LENGTH = 0x0000
+ infoc : ORIGIN = 0x0000, LENGTH = 0x0000
+ infod : ORIGIN = 0x0000, LENGTH = 0x0000
+ far_rom : ORIGIN = 0x00000000, LENGTH = 0x00000000
+}
+REGION_ALIAS("REGION_TEXT", rom);
+REGION_ALIAS("REGION_DATA", ram);
+REGION_ALIAS("REGION_FAR_ROM", far_rom);
/* Default linker script, for normal executables */
-OUTPUT_FORMAT("elf32-msp430","elf32-msp430","elf32-msp430")
-OUTPUT_ARCH(msp:42)
-MEMORY
-{
- text (rx) : ORIGIN = 0x8000, LENGTH = 0x7fe0 /* 32K */
- data (rwx) : ORIGIN = 0x0200, LENGTH = 0x2000 /* 8K */
- vectors (rw) : ORIGIN = 0xffe0, LENGTH = 32
- bootloader(rx) : ORIGIN = 0x0c00, LENGTH = 1K
- infomem(rx) : ORIGIN = 0x1000, LENGTH = 256
- infomemnobits(rx) : ORIGIN = 0x1000, LENGTH = 256
-}
+OUTPUT_FORMAT("elf32-msp430")
+OUTPUT_ARCH("msp430")
+INCLUDE memory.x
+INCLUDE periph.x
SECTIONS
{
/* Read-only sections, merged into text segment. */
/* Internal text space. */
.text :
{
- . = ALIGN(2);
- *(.init)
+ . = ALIGN(2);
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) /* Jumps here after main(). User definable. */
- KEEP(*(.fini9))
+ *(.fini9) /* Falls into here after main(). User definable. */
*(.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
+ . = ALIGN(2);
+ __ctors_start = . ;
+ KEEP(*(.ctors))
+ __ctors_end = . ;
+ __dtors_start = . ;
+ KEEP(*(.dtors))
+ __dtors_end = . ;
+ . = ALIGN(2);
+ *(.text)
+ . = ALIGN(2);
+ *(.text.*)
+ _etext = .;
+ } > REGION_TEXT
.data :
{
+ . = ALIGN(2);
PROVIDE (__data_start = .) ;
- . = ALIGN(2);
*(.data)
*(SORT_BY_ALIGNMENT(.data.*))
- . = ALIGN(2);
+ . = ALIGN(2);
*(.gnu.linkonce.d*)
- . = ALIGN(2);
+ . = ALIGN(2);
_edata = . ;
- } > data AT > text
+ } > REGION_DATA AT > REGION_TEXT
PROVIDE (__data_load_start = LOADADDR(.data) );
PROVIDE (__data_size = SIZEOF(.data) );
- /* Bootloader. */
- .bootloader :
- {
- PROVIDE (__boot_start = .) ;
- *(.bootloader)
- . = ALIGN(2);
- *(.bootloader.*)
- } > bootloader
- /* Information memory. */
- .infomem :
- {
- *(.infomem)
- . = ALIGN(2);
- *(.infomem.*)
- } > infomem
- /* Information memory (not loaded into MPU). */
- .infomemnobits :
- {
- *(.infomemnobits)
- . = ALIGN(2);
- *(.infomemnobits.*)
- } > infomemnobits
.bss :
{
PROVIDE (__bss_start = .) ;
*(COMMON)
PROVIDE (__bss_end = .) ;
_end = . ;
- } > data
+ } > REGION_DATA
PROVIDE (__bss_size = SIZEOF(.bss) );
.noinit :
{
*(COMMON)
PROVIDE (__noinit_end = .) ;
_end = . ;
- } > data
+ } > REGION_DATA
+ /* Information memory. */
+ .infomem :
+ {
+ *(.infomem)
+ . = ALIGN(2);
+ *(.infomem.*)
+ } > infomem
.vectors :
{
PROVIDE (__vectors_start = .) ;
- *(.vectors*)
KEEP(*(.vectors*))
_vectors_end = . ;
} > vectors
+ .fartext :
+ {
+ . = ALIGN(2);
+ *(.fartext)
+ . = ALIGN(2);
+ *(.fartext.*)
+ _efartext = .;
+ } > REGION_FAR_ROM
/* Stabs for profiling information*/
.profiler 0 : { *(.profiler) }
/* Stabs debugging sections. */
.debug 0 : { *(.debug) }
.line 0 : { *(.line) }
/* GNU DWARF 1 extensions */
- .debug_srcinfo 0 : { *(.debug_srcinfo) }
- .debug_sfnames 0 : { *(.debug_sfnames) }
+ .debug_srcinfo 0 : { *(.debug_srcinfo .zdebug_srcinfo) }
+ .debug_sfnames 0 : { *(.debug_sfnames .zdebug_sfnames) }
/* DWARF 1.1 and DWARF 2 */
- .debug_aranges 0 : { *(.debug_aranges) }
- .debug_pubnames 0 : { *(.debug_pubnames) }
+ .debug_aranges 0 : { *(.debug_aranges .zdebug_aranges) }
+ .debug_pubnames 0 : { *(.debug_pubnames .zdebug_pubnames) }
/* DWARF 2 */
- .debug_info 0 : { *(.debug_info) *(.gnu.linkonce.wi.*) }
- .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) }
+ .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.* .zdebug_info) }
+ .debug_abbrev 0 : { *(.debug_abbrev .zdebug_abbrev) }
+ .debug_line 0 : { *(.debug_line .zdebug_line) }
+ .debug_frame 0 : { *(.debug_frame .zdebug_frame) }
+ .debug_str 0 : { *(.debug_str .zdebug_str) }
+ .debug_loc 0 : { *(.debug_loc .zdebug_loc) }
+ .debug_macinfo 0 : { *(.debug_macinfo .zdebug_macinfo) }
/* DWARF 3 */
.debug_pubtypes 0 : { *(.debug_pubtypes) }
.debug_ranges 0 : { *(.debug_ranges) }
- PROVIDE (__stack = ORIGIN(data) + LENGTH(data)) ;
- PROVIDE (__data_start_rom = _etext) ;
- PROVIDE (__data_end_rom = _etext + SIZEOF (.data)) ;
- PROVIDE (__noinit_start_rom = _etext + SIZEOF (.data)) ;
- PROVIDE (__noinit_end_rom = _etext + SIZEOF (.data) + SIZEOF (.noinit)) ;
- PROVIDE (__subdevice_has_heap = 0) ;
+ PROVIDE (__stack = ORIGIN(ram) + LENGTH(ram));
+ PROVIDE (__data_start_rom = _etext);
+ PROVIDE (__data_end_rom = _etext + SIZEOF (.data));
+ PROVIDE (__noinit_start_rom = _etext + SIZEOF (.data));
+ PROVIDE (__noinit_end_rom = _etext + SIZEOF (.data) + SIZEOF (.noinit));
}