Adds support for placing MSP430 code and data into either low memory or high memory.
* msp430/msp430.ld: Delete. * msp430/msp430F5438A-l.ld: Delete. * msp430/msp430F5438A-s.ld: Delete. * msp430/crt_movedata.S: Delete. * msp430/Makefile.in (SCRIPTS): Remove msp430.ld. (CRT_OBJS): Add crt_move_highdata.o. * msp430/memmodel.h (START_CRT_FUNC): New macro. (END_CRT_FUNC): New macro. (WEAK_DEF): New macro. * msp430/crt0.S: Use new macros. (move_highdata): New code to initialise the .data section if it is held in high memory. * msp430/msp430-sim.ld (.data): Add .either.data. (.rodata2): Move some read-only data sections here. (.text): Add .either.text. (.rodata): Add .either.rodata. (.bss): Add .either.bss. * msp430/msp430xl-sim.ld (MEMORY): Add HIROM. (.rodata2): Move some read-only data sections here. (.upper.data): New section. Include notes about how to initialise it.
This commit is contained in:
		
							parent
							
								
									761a123a4f
								
							
						
					
					
						commit
						baa681fd38
					
				|  | @ -1,3 +1,29 @@ | |||
| 2015-05-05  Nick Clifton  <nickc@redhat.com> | ||||
| 
 | ||||
| 	* msp430/msp430.ld: Delete. | ||||
| 	* msp430/msp430F5438A-l.ld: Delete. | ||||
| 	* msp430/msp430F5438A-s.ld: Delete. | ||||
| 	* msp430/crt_movedata.S: Delete. | ||||
| 
 | ||||
| 	* msp430/Makefile.in (SCRIPTS): Remove msp430.ld. | ||||
| 	(CRT_OBJS): Add crt_move_highdata.o. | ||||
| 	* msp430/memmodel.h (START_CRT_FUNC): New macro. | ||||
| 	(END_CRT_FUNC): New macro. | ||||
| 	(WEAK_DEF): New macro. | ||||
| 	* msp430/crt0.S: Use new macros. | ||||
| 	(move_highdata): New code to initialise the .data section if it is | ||||
| 	held in high memory. | ||||
| 
 | ||||
| 	* msp430/msp430-sim.ld (.data): Add .either.data. | ||||
| 	(.rodata2): Move some read-only data sections here. | ||||
| 	(.text): Add .either.text. | ||||
| 	(.rodata): Add .either.rodata. | ||||
| 	(.bss): Add .either.bss. | ||||
| 	* msp430/msp430xl-sim.ld (MEMORY): Add HIROM. | ||||
| 	(.rodata2): Move some read-only data sections here. | ||||
| 	(.upper.data): New section.  Include notes about how to initialise | ||||
| 	it. | ||||
| 
 | ||||
| 2015-04-21  Mike Frysinger  <vapier@gentoo.org> | ||||
| 
 | ||||
| 	* mcore/syscall.h: New header. | ||||
|  |  | |||
|  | @ -57,8 +57,7 @@ OBJCOPY = `if [ -f ${objroot}/../binutils/objcopy ] ; \ | |||
| 	then echo ${objroot}/../binutils/objcopy ; \
 | ||||
| 	else t='$(program_transform_name)'; echo objcopy | sed -e $$t ; fi` | ||||
| 
 | ||||
| SCRIPTS  = $(srcdir)/msp430.ld | ||||
| SCRIPTS += $(srcdir)/msp430-sim.ld | ||||
| SCRIPTS  = $(srcdir)/msp430-sim.ld | ||||
| SCRIPTS += $(srcdir)/msp430xl-sim.ld | ||||
| SCRIPTS += $(srcdir)/intr_vectors.ld | ||||
| 
 | ||||
|  | @ -84,6 +83,7 @@ CRT_OBJS = \ | |||
| 	crt_bss.o \
 | ||||
| 	crt_high_bss.o \
 | ||||
| 	crt_movedata.o \
 | ||||
| 	crt_move_highdata.o \
 | ||||
| 	crt_main.o \
 | ||||
| 	crt_main_minrt.o \
 | ||||
| 	crt_callexit.o \
 | ||||
|  |  | |||
|  | @ -1,4 +1,4 @@ | |||
| /* Copyright (c) 2012-2013 Red Hat, Inc. All rights reserved. | ||||
| /* Copyright (c) 2012-2015 Red Hat, Inc. All rights reserved. | ||||
| 
 | ||||
|    This copyrighted material is made available to anyone wishing to use, modify, | ||||
|    copy, or redistribute it subject to the terms and conditions of the BSD | ||||
|  | @ -14,37 +14,64 @@ | |||
| #include "memmodel.h" | ||||
| 
 | ||||
| ;; The linker links all .crt_* sections in asciibetical order at the
 | ||||
| ;; same place.  So, the four digits in .crt_NNNN determine the link
 | ||||
| ;; order, so, keep them in sequential order here.  The first two
 | ||||
| ;; digits are set here, the second two allow users to insert code
 | ||||
| ;; between code fragments here.
 | ||||
| ;; same place.  So, the four digits in .crt_NNNN_xxx name created by
 | ||||
| ;; the START_CRT_FUNC macro determine the link order, so, keep them
 | ||||
| ;; in sequential order here.  The first two digits are set here, the
 | ||||
| ;; second two allow users to insert code between code fragments here.
 | ||||
| 
 | ||||
| #if L0 | ||||
| 	.section ".resetvec", "a" | ||||
| __msp430_resetvec_hook: | ||||
| 	.word	__start
 | ||||
| 	.word	__crt0_start
 | ||||
| 
 | ||||
| 	.section ".crt_0000init", "ax", @progbits
 | ||||
| 	;; Here we provide weak definitions of the symbols used in the
 | ||||
| 	;; init_highbss and move_highdata blocks, in case they are not
 | ||||
| 	;; provided by the linker script.  They are defined here because
 | ||||
| 	;; this block is always included in every executable, and because
 | ||||
| 	;; if there were defined in the blocks that need them their values
 | ||||
| 	;; would be used without giving the linker script a chance to
 | ||||
| 	;; override them.
 | ||||
| 	;; 
 | ||||
| 	;; The weak definitions are needed if the user targets an MCU
 | ||||
| 	;; without high memory - and hence uses a linker script without
 | ||||
| 	;; a definition of the .upper.bss or .upper.data sections - and
 | ||||
| 	;; they have compiled their code with the -mdata-region=either
 | ||||
| 	;; command line option.  That option causes the assembler to
 | ||||
| 	;; define the __crt0_move_highdata and/or crt0_init_highbss
 | ||||
| 	;; symbols, which in turn forces the inclusion of the
 | ||||
| 	;; move_highdata and/or init_highbss blocks in the startup code,
 | ||||
| 	;; regardless of the fact that the sections are not present in
 | ||||
| 	;; the linker script.
 | ||||
| 
 | ||||
| 	WEAK_DEF __upper_data_init | ||||
| 	WEAK_DEF __rom_highdatacopysize | ||||
| 	WEAK_DEF __high_datastart | ||||
| 	WEAK_DEF __rom_highdatastart | ||||
| 	WEAK_DEF __high_bssstart | ||||
| 	WEAK_DEF __high_bsssize | ||||
| 
 | ||||
| START_CRT_FUNC 0000 start | ||||
| 	.refsym	__msp430_resetvec_hook
 | ||||
| #ifdef MINRT | ||||
| 	.refsym	__crt0_call_just_main
 | ||||
| #else | ||||
| 	.refsym	__crt0_call_init_then_main
 | ||||
| #endif | ||||
| 	.global __start
 | ||||
| __start: | ||||
| 	mov_	#__stack, R1 | ||||
| 
 | ||||
| 	;; Disable watchdog timer.
 | ||||
| 	MOV	#0x5a80, &0x15C | ||||
| END_CRT_FUNC	start | ||||
| #endif | ||||
| 
 | ||||
| #if Lbss | ||||
| 	.section ".crt_0100bss", "ax", @progbits
 | ||||
| 
 | ||||
| 	.global __crt0_init_bss
 | ||||
| __crt0_init_bss:	 | ||||
| 	 | ||||
| #if Lbss | ||||
| ;; Note - this section is only included in the startup code of the
 | ||||
| ;; application if it is needed.  It is responsible for initializing
 | ||||
| ;; the contents of the .bss section.
 | ||||
| 
 | ||||
| START_CRT_FUNC 0100 init_bss | ||||
| 
 | ||||
| 	mov_	#__bssstart, R12 | ||||
| 	clr.w	R13 | ||||
| 	mov.w	#__bsssize, R14 | ||||
|  | @ -52,32 +79,41 @@ __crt0_init_bss: | |||
| 	clr.w	R15		; We assume that __bsssize is never > 64M
 | ||||
| #endif | ||||
| 	call_	#memset | ||||
| #endif | ||||
| 
 | ||||
| END_CRT_FUNC	init_bss | ||||
| #endif /* Lbss */ | ||||
| 
 | ||||
| 
 | ||||
| #ifdef __MSP430X_LARGE__ | ||||
| #if Lhigh_bss | ||||
| ;;  Note - this section is only included in the
 | ||||
| ;;  startup code of the application if it is needed.
 | ||||
| ;; Note - this section is only included in the startup code of the
 | ||||
| ;; application if it is needed.  It is responsible for initializing
 | ||||
| ;; the contents of the .upper.bss section.
 | ||||
| 
 | ||||
| 	.section ".crt_0150high_bss", "ax", @progbits
 | ||||
| START_CRT_FUNC 0200 init_highbss | ||||
| 	 | ||||
| 	.global __crt0_init_high_bss
 | ||||
| __crt0_init_high_bss: | ||||
| 	 | ||||
| 	mov_	#llo(__high_bssstart), R12 | ||||
| 	mov_	#lhi(__high_bssstart), R13 | ||||
| 	mov.w	#llo(__high_bsssize), R14 | ||||
| 	mov.w	#lhi(__high_bsssize), R15	 | ||||
| 	mov_	#__high_bssstart, R12 | ||||
| 	mov.w	#0, R13 | ||||
| 	mov_	#__high_bsssize, R14 | ||||
| 	;; If __high_bsssize is zero then skip the call to memset.
 | ||||
| 	;; This can happen if all of the bss data was placed into .either.bss.
 | ||||
| 	cmp.w	#0, R14 | ||||
| 	jeq	1f | ||||
| 	call_	#memset | ||||
| 1: | ||||
| END_CRT_FUNC	init_highbss | ||||
| #endif /* Lhigh_bss */ | ||||
| #endif /* __MSP430X_LARGE__ */ | ||||
| 
 | ||||
| #if Lmovedata | ||||
| 	.section ".crt_0200movedata", "ax", @progbits
 | ||||
| 
 | ||||
| 	.global __crt0_movedata
 | ||||
| __crt0_movedata:	 | ||||
| 	 | ||||
| #if Lmovedata | ||||
| ;; Note - this section is only included in the startup code of the
 | ||||
| ;; application if it is needed.  It is responsible for copying the
 | ||||
| ;; contents of the .data section from its load address (in ROM) to
 | ||||
| ;; its run-time address (in RAM).
 | ||||
| 
 | ||||
| START_CRT_FUNC 0300 movedata | ||||
| 
 | ||||
| 	mov_	#__datastart, R12 | ||||
| 	mov_	#__romdatastart, R13 | ||||
| 
 | ||||
|  | @ -85,44 +121,104 @@ __crt0_movedata: | |||
| 	cmp_	R12, R13 | ||||
| 	jeq	1f | ||||
| 
 | ||||
| 	mov.w	#__romdatacopysize, R14 | ||||
| #ifdef __MSP430X_LARGE__ | ||||
| 	clr.w	R15		; We assume that __romdatacopysize is never > 64M
 | ||||
| #endif | ||||
| 	mov_	#__romdatacopysize, R14 | ||||
| 
 | ||||
| 	call_	#memmove | ||||
| 1:	 | ||||
| #endif | ||||
| 1: | ||||
| END_CRT_FUNC	movedata | ||||
| #endif /* Lmovedata  */ | ||||
| 
 | ||||
| 
 | ||||
| #ifdef __MSP430X_LARGE__ | ||||
| #if Lmove_highdata | ||||
| ;; Note - this section is only included in the startup code of the application
 | ||||
| ;; if it is needed.  It is responsible either for making sure that the
 | ||||
| ;; contents of the .upper.data section have their correct startup values.
 | ||||
| ;; If a copy of the .upper.data section is stored in ROM then this means
 | ||||
| ;; copying the contents into HIFRAM.  If a copy of .upper.data is stored in a
 | ||||
| ;; shadow section in HIFRAM then this means copying from the shadow section
 | ||||
| ;; into the real section.
 | ||||
| 
 | ||||
| START_CRT_FUNC 0400 move_highdata | ||||
| 	;;  __rom_highdatacopysize may be zero.  Test this first because
 | ||||
| 	;; its value may come from the weak definitions above and we do
 | ||||
| 	;; not want to access the memory at address 0 pointed to by the
 | ||||
| 	;; weak definition of __upper_data_init.
 | ||||
| 	mov.w	#__rom_highdatacopysize, R14 | ||||
| 	cmp.w	#0, R14 | ||||
| 	jeq	3f | ||||
| 
 | ||||
| 	/* Test our status word.  */ | ||||
| 	cmpx.w  #0, &__upper_data_init | ||||
| 	jeq	1f | ||||
| 	/* Status word is non-zero - copy from shadow into upper.  */ | ||||
| 	mov_	#__high_datastart, R12 | ||||
| 	mov_	#__rom_highdatastart, R13 | ||||
| 	jmp	2f | ||||
| 
 | ||||
| 1:	/* Status word is zero.  Copy from upper to shadow and change status word.  */ | ||||
| 	movx.w  #1, &__upper_data_init | ||||
| 	mov_	#__rom_highdatastart, R12 | ||||
| 	mov_	#__high_datastart, R13 | ||||
| 
 | ||||
| 2:	;; __rom_highdatacopysize may be zero.  memmove should cope.
 | ||||
| 	mov.w	#__rom_highdatacopysize, R14 | ||||
| 
 | ||||
| 	call_	#memmove | ||||
| 3: | ||||
| END_CRT_FUNC	move_highdata | ||||
| #endif /* Lmove_highdata */ | ||||
| #endif /* __MSP430X_LARGE__ */ | ||||
| 
 | ||||
| 
 | ||||
| #if Lmain_minrt | ||||
| 	.section ".crt_0300main", "ax", @progbits
 | ||||
| 	.global	__crt0_call_just_main
 | ||||
| __crt0_call_just_main: | ||||
| ;; Note - this section is only included in the startup code of the
 | ||||
| ;; application if it is needed.  It is responsible for just calling
 | ||||
| ;; main.  No initialization code is called first, and main is not
 | ||||
| ;; expected to return.
 | ||||
| 
 | ||||
| START_CRT_FUNC 0600 call_just_main | ||||
| 
 | ||||
| 	clr.w	R12		; Set argc == 0
 | ||||
| 	call_	#main | ||||
| #endif | ||||
| END_CRT_FUNC	call_just_main | ||||
| #endif /* Lmain_minrt */ | ||||
| 
 | ||||
| 
 | ||||
| #if Lmain | ||||
| 	.section ".crt_0300main", "ax", @progbits
 | ||||
| 	.global	__crt0_call_init_then_main
 | ||||
| __crt0_call_init_then_main: | ||||
| ;; Note - this section is only included in the startup code of the
 | ||||
| ;; application if it is needed.  It is responsible for calling the
 | ||||
| ;; initialization code - constructors, etc - and then main.  If main
 | ||||
| ;; returns then the following section should be present to catch it.
 | ||||
| 
 | ||||
| START_CRT_FUNC 0700 call_init_then_main | ||||
| 
 | ||||
| 	call_	#__msp430_init | ||||
| 
 | ||||
| 	clr.w	R12		; Set argc == 0
 | ||||
| 	call_	#main | ||||
| #endif | ||||
| 
 | ||||
| END_CRT_FUNC	call_init_then_main | ||||
| #endif /* Lmain */ | ||||
| 
 | ||||
| 
 | ||||
| #if Lcallexit | ||||
| 	.section ".crt_0400main_exit", "ax", @progbits
 | ||||
| 	.global	__crt0_call_exit
 | ||||
| __crt0_call_exit: | ||||
| ;; Note - this section is only included in the startup code of the
 | ||||
| ;; application if it is needed.  It is responsible for calling exit
 | ||||
| ;; once main has finished.
 | ||||
| 
 | ||||
| START_CRT_FUNC 0800 call_exit | ||||
| 
 | ||||
| 	call_	#_exit | ||||
| #endif | ||||
| 
 | ||||
| END_CRT_FUNC	call_exit | ||||
| #endif /* Lcallexit  */ | ||||
| 
 | ||||
| ;----------------------------------------
 | ||||
| 
 | ||||
| #ifndef MINRT | ||||
| #if L0 | ||||
| 	.section ".crt_0500main_init", "ax", @progbits
 | ||||
| 	.section ".crt_0900main_init", "ax", @progbits
 | ||||
| 	.global	_msp430_run_init_array
 | ||||
| 	.type	_msp430_run_init_array,@function
 | ||||
| _msp430_run_init_array: | ||||
|  | @ -172,4 +268,4 @@ __msp430_fini: | |||
| 	call_	#_msp430_run_fini_array | ||||
| 	 | ||||
| #endif | ||||
| #endif | ||||
| #endif /* not MINRT */ | ||||
|  |  | |||
|  | @ -1,50 +0,0 @@ | |||
| /* Copyright (c) 2012-2013 Red Hat Incorporated. | ||||
|    All rights reserved. | ||||
| 
 | ||||
|    Redistribution and use in source and binary forms, with or without | ||||
|    modification, are permitted provided that the following conditions | ||||
|    are met:  | ||||
| 
 | ||||
|      Redistributions of source code must retain the above copyright  | ||||
|      notice, this list of conditions and the following disclaimer. | ||||
| 
 | ||||
|      Redistributions in binary form must reproduce the above copyright | ||||
|      notice, this list of conditions and the following disclaimer in the | ||||
|      documentation and/or other materials provided with the distribution. | ||||
| 
 | ||||
|      The name of Red Hat Incorporated may not be used to endorse  | ||||
|      or promote products derived from this software without specific  | ||||
|      prior written permission. | ||||
| 
 | ||||
|    This software is provided by the copyright holders and contributors | ||||
|    "AS IS" and any express or implied warranties, including, but not | ||||
|    limited to, the implied warranties of merchantability and fitness for | ||||
|    a particular purpose are disclaimed.  In no event shall Red Hat | ||||
|    incorporated be liable for any direct, indirect, incidental, special, | ||||
|    exemplary, or consequential damages (including, but not limited to, | ||||
|    procurement of substitute goods or services; loss of use, data, or
 | ||||
|    profits; or business interruption) however caused and on any theory of
 | ||||
|    liability, whether in contract, strict liability, or tort (including | ||||
|    negligence or otherwise) arising in any way out of the use of this | ||||
|    software, even if advised of the possibility of such damage.  */ | ||||
| 
 | ||||
| #include "memmodel.h" | ||||
| 
 | ||||
| 	.section ".crt_movedata", "ax", @progbits
 | ||||
| 
 | ||||
| 	.global __crt0_movedata
 | ||||
| __crt0_movedata:	 | ||||
| 	 | ||||
| 	mov_	#__datastart, R12 | ||||
| 	mov_	#__romdatastart, R13 | ||||
| 
 | ||||
| 	;;  memmove and memcpy do not currently work when src == dst
 | ||||
| 	cmp_	R12, R13 | ||||
| 	jeq	1f | ||||
| 
 | ||||
| 	mov.w	#__romdatacopysize, R14 | ||||
| #ifdef __MSP430X_LARGE__ | ||||
| 	clr.w	R15		; We assume that __romdatacopysize is never > 64M
 | ||||
| #endif | ||||
| 	call_	#memmove | ||||
| 1:	 | ||||
|  | @ -1,4 +1,4 @@ | |||
| /* Copyright (c) 2012-2013 Red Hat, Inc. All rights reserved.
 | ||||
| /* Copyright (c) 2012-2015 Red Hat, Inc. All rights reserved.
 | ||||
| 
 | ||||
|    This copyrighted material is made available to anyone wishing to use, modify, | ||||
|    copy, or redistribute it subject to the terms and conditions of the BSD | ||||
|  | @ -37,5 +37,30 @@ | |||
| #define add_	ADD | ||||
| #define PTRsz	2 | ||||
| 
 | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
| /* Start a function in its own named and numbered section, so that it
 | ||||
|    can be subject to linker garbage collection.  The numbers are used | ||||
|    to enforce link-time ordering of the sections.  Note - the construction | ||||
|    of the symbol names is critical - they need to match the unresolved | ||||
|    symbol references created by the compiler and assembler.  */ | ||||
| .macro START_CRT_FUNC number name  | ||||
| 	.section .crt_\number\name,"ax",@progbits | ||||
| 	.global __crt0_\name | ||||
| 	.type __crt0_\name , @function | ||||
| __crt0_\name: | ||||
| .endm | ||||
| 
 | ||||
| 
 | ||||
| /* End a named function.  Sets the size so that GDB does not get confused.  */ | ||||
| .macro END_CRT_FUNC name  | ||||
|    .size __crt0_\name, . - __crt0_\name | ||||
| .endm | ||||
| 
 | ||||
| 
 | ||||
| /* Provide a weak definition of NAME, initialized to zero.  */ | ||||
| .macro WEAK_DEF name | ||||
| 	.global \name | ||||
| 	.weak	\name | ||||
|    \name  = 0 | ||||
| .endm | ||||
|  |  | |||
|  | @ -1,4 +1,4 @@ | |||
| /*  Copyright (c) 2013-2014 Red Hat, Inc. All rights reserved. | ||||
| /* Copyright (c) 2013-2015 Red Hat, Inc. All rights reserved. | ||||
| 
 | ||||
|    This copyrighted material is made available to anyone wishing to use, modify, | ||||
|    copy, or redistribute it subject to the terms and conditions of the BSD | ||||
|  | @ -33,11 +33,15 @@ SECTIONS | |||
|   { | ||||
|     . = ALIGN(2); | ||||
|     *(.plt) | ||||
|     . = ALIGN(2); | ||||
|     *(.lower.rodata.* .lower.rodata) | ||||
|     . = ALIGN(2); | ||||
|     *(.rodata .rodata.* .gnu.linkonce.r.* .const .const:*) | ||||
|     . = ALIGN(2); | ||||
|     *(.either.rodata.* .either.rodata) | ||||
|     . = ALIGN(2); | ||||
|     *(.rodata1) | ||||
|     *(.eh_frame_hdr) | ||||
|     KEEP (*(.eh_frame)) | ||||
| 
 | ||||
|     KEEP (*(.gcc_except_table)) *(.gcc_except_table.*) | ||||
|     PROVIDE (__preinit_array_start = .); | ||||
|     KEEP (*(.preinit_array)) | ||||
|  | @ -52,6 +56,17 @@ SECTIONS | |||
|     PROVIDE (__fini_array_end = .); | ||||
|     LONG(0); /* Sentinel.  */ | ||||
| 
 | ||||
|   } > RAM | ||||
| 
 | ||||
|   /* Note: This is a separate .rodata section for sections which are | ||||
|      read only but which older linkers treat as read-write. | ||||
|      This prevents older linkers from marking the entire .rodata | ||||
|      section as read-write.  */ | ||||
|   .rodata2 : { | ||||
|     . = ALIGN(2); | ||||
|     *(.eh_frame_hdr) | ||||
|     KEEP (*(.eh_frame)) | ||||
| 
 | ||||
|     /* gcc uses crtbegin.o to find the start of the constructors, so | ||||
|        we make sure it is first.  Because this is a wildcard, it | ||||
|        doesn't matter if the user does not actually link against | ||||
|  | @ -80,8 +95,9 @@ SECTIONS | |||
|     PROVIDE (_start = .); | ||||
|     KEEP (*(SORT(.crt_*))) | ||||
|     *(.lowtext) | ||||
|     *(.lower.text.* .lower.text)     | ||||
|     *(.lower.text.* .lower.text) | ||||
|     *(.text .stub .text.* .gnu.linkonce.t.* .text:*) | ||||
|     *(.either.text.* .either.text) | ||||
|     KEEP (*(.text.*personality*)) | ||||
|     /* .gnu.warning sections are handled specially by elf32.em.  */ | ||||
|     *(.gnu.warning) | ||||
|  | @ -101,11 +117,15 @@ SECTIONS | |||
|     PROVIDE (__datastart = .); | ||||
| 
 | ||||
|     *(.lower.data.* .lower.data) | ||||
| 
 | ||||
|     *(.data .data.* .gnu.linkonce.d.*) | ||||
| 
 | ||||
|     *(.either.data.* .either.data) | ||||
| 
 | ||||
|     KEEP (*(.jcr)) | ||||
|     *(.data.rel.ro.local) *(.data.rel.ro*) | ||||
|     *(.dynamic) | ||||
| 
 | ||||
|     *(.data .data.* .gnu.linkonce.d.*) | ||||
|     KEEP (*(.gnu.linkonce.d.*personality*)) | ||||
|     SORT(CONSTRUCTORS) | ||||
|     *(.data1) | ||||
|  | @ -136,6 +156,7 @@ SECTIONS | |||
|     *(.dynbss) | ||||
|     *(.sbss .sbss.*) | ||||
|     *(.bss .bss.* .gnu.linkonce.b.*) | ||||
|     *(.either.bss.* .either.bss) | ||||
|     PROVIDE (__bssend = .); | ||||
|   } > RAM | ||||
|   PROVIDE (__bsssize = SIZEOF(.bss)); | ||||
|  | @ -167,7 +188,7 @@ SECTIONS | |||
|     *(.upper.data.* .upper.data) | ||||
|     *(.upper.bss.* .upper.bss) | ||||
|     *(.upper.text.* .upper.text)   | ||||
|     ASSERT (SIZEOF(.upper) == 0, ".upper sections present in a binary linked without -mlarge support"); | ||||
|     ASSERT (SIZEOF(.upper) == 0, "This MCU does not support high memory"); | ||||
|   } | ||||
| 
 | ||||
|   /* The rest are all not normally part of the runtime image.  */ | ||||
|  |  | |||
|  | @ -1,200 +0,0 @@ | |||
| /* Copyright (c) 2005,2008,2009,2011,2013 Red Hat, Inc. All rights reserved. | ||||
| 
 | ||||
|    This copyrighted material is made available to anyone wishing to use, modify, | ||||
|    copy, or redistribute it subject to the terms and conditions of the BSD | ||||
|    License.   This program is distributed in the hope that it will be useful, | ||||
|    but WITHOUT ANY WARRANTY expressed or implied, including the implied warranties | ||||
|    of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  A copy of this license | ||||
|    is available at http://www.opensource.org/licenses. Any Red Hat trademarks that | ||||
|    are incorporated in the source code or documentation are not subject to the BSD | ||||
|    License and may only be used or replicated with the express permission of | ||||
|    Red Hat, Inc. | ||||
| */ | ||||
| 
 | ||||
| /* Default linker script, for normal executables */ | ||||
| OUTPUT_ARCH(msp430) | ||||
| ENTRY(_start) | ||||
| 
 | ||||
| /* Do we need any of these for elf? | ||||
|    __DYNAMIC = 0;    */ | ||||
| 
 | ||||
| INCLUDE intr_vectors.ld | ||||
| 
 | ||||
| MEMORY { | ||||
| 	RAM (w)      : ORIGIN = 0x00200, LENGTH = 0x0ee00 | ||||
| 	RESETVEC (w) : ORIGIN = 0x0fffe, LENGTH = 0x00002 | ||||
| } | ||||
| 
 | ||||
| SECTIONS | ||||
| { | ||||
|   .resetvec : | ||||
|   { | ||||
|     *(.resetvec) | ||||
|   } > RESETVEC | ||||
| 
 | ||||
|   .rodata : { | ||||
|     . = ALIGN(2); | ||||
|     *(.plt) | ||||
|     *(.rodata .rodata.* .gnu.linkonce.r.* .const .const:*) | ||||
|     *(.rodata1) | ||||
|     *(.eh_frame_hdr) | ||||
|     KEEP (*(.eh_frame)) | ||||
|     KEEP (*(.gcc_except_table)) *(.gcc_except_table.*) | ||||
|     PROVIDE (__preinit_array_start = .); | ||||
|     KEEP (*(.preinit_array)) | ||||
|     PROVIDE (__preinit_array_end = .); | ||||
|     PROVIDE (__init_array_start = .); | ||||
|     KEEP (*(SORT(.init_array.*))) | ||||
|     KEEP (*(.init_array)) | ||||
|     PROVIDE (__init_array_end = .); | ||||
|     PROVIDE (__fini_array_start = .); | ||||
|     KEEP (*(.fini_array)) | ||||
|     KEEP (*(SORT(.fini_array.*))) | ||||
|     PROVIDE (__fini_array_end = .); | ||||
|     LONG(0); /* Sentinel.  */ | ||||
| 
 | ||||
|     /* gcc uses crtbegin.o to find the start of the constructors, 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.  */ | ||||
|     KEEP (*crtbegin*.o(.ctors)) | ||||
| 
 | ||||
|     /* We don't want to include the .ctor section from from the | ||||
|        crtend.o file until after the sorted ctors.  The .ctor section | ||||
|        from the crtend file contains the end of ctors marker and it | ||||
|        must be last */ | ||||
|     KEEP (*(EXCLUDE_FILE (*crtend*.o ) .ctors)) | ||||
|     KEEP (*(SORT(.ctors.*))) | ||||
|     KEEP (*(.ctors)) | ||||
| 
 | ||||
|     KEEP (*crtbegin*.o(.dtors)) | ||||
|     KEEP (*(EXCLUDE_FILE (*crtend*.o ) .dtors)) | ||||
|     KEEP (*(SORT(.dtors.*))) | ||||
|     KEEP (*(.dtors)) | ||||
|   } > RAM | ||||
| 
 | ||||
|   .text           : | ||||
|   { | ||||
|     . = ALIGN(2); | ||||
|     PROVIDE (_start = .); | ||||
|     KEEP (*(SORT(.crt_*))) | ||||
|     *(.lowtext .text .stub .text.* .gnu.linkonce.t.* .text:*) | ||||
|     KEEP (*(.text.*personality*)) | ||||
|     /* .gnu.warning sections are handled specially by elf32.em.  */ | ||||
|     *(.gnu.warning) | ||||
|     *(.interp .hash .dynsym .dynstr .gnu.version*) | ||||
|     PROVIDE (__etext = .); | ||||
|     PROVIDE (_etext = .); | ||||
|     PROVIDE (etext = .); | ||||
|     . = ALIGN(2); | ||||
|     KEEP (*(.init)) | ||||
|     KEEP (*(.fini)) | ||||
|     KEEP (*(.tm_clone_table)) | ||||
|   } > RAM | ||||
| 
 | ||||
|   .data : { | ||||
|     . = ALIGN(2); | ||||
|     PROVIDE (__datastart = .); | ||||
| 
 | ||||
|     KEEP (*(.jcr)) | ||||
|     *(.data.rel.ro.local) *(.data.rel.ro*) | ||||
|     *(.dynamic) | ||||
| 
 | ||||
|     *(.data .data.* .gnu.linkonce.d.*) | ||||
|     KEEP (*(.gnu.linkonce.d.*personality*)) | ||||
|     SORT(CONSTRUCTORS) | ||||
|     *(.data1) | ||||
|     *(.got.plt) *(.got) | ||||
| 
 | ||||
|     /* We want the small data sections together, so single-instruction offsets | ||||
|        can access them all, and initialized data all before uninitialized, so | ||||
|        we can shorten the on-disk segment size.  */ | ||||
|     . = ALIGN(2); | ||||
|     *(.sdata .sdata.* .gnu.linkonce.s.* D_2 D_1) | ||||
| 
 | ||||
|     . = ALIGN(2); | ||||
|     _edata = .; | ||||
|     PROVIDE (edata = .); | ||||
|     PROVIDE (__dataend = .); | ||||
|   } > RAM | ||||
| 
 | ||||
|   /* Note that crt0 assumes this is a multiple of two; all the | ||||
|      start/stop symbols are also assumed word-aligned.  */ | ||||
|   PROVIDE(__romdatastart = LOADADDR(.data)); | ||||
|   PROVIDE (__romdatacopysize = SIZEOF(.data)); | ||||
| 
 | ||||
|   .bss : { | ||||
|     . = ALIGN(2); | ||||
|     PROVIDE (__bssstart = .); | ||||
|     *(.dynbss) | ||||
|     *(.sbss .sbss.*) | ||||
|     *(.bss .bss.* .gnu.linkonce.b.*) | ||||
|     PROVIDE (__bssend = .); | ||||
|   } > RAM | ||||
|   PROVIDE (__bsssize = SIZEOF(.bss)); | ||||
| 
 | ||||
|   /* This section contains data that is not initialised at startup.  */ | ||||
|   .noinit : { | ||||
|     . = ALIGN(2); | ||||
|     PROVIDE (__noinit_start = .); | ||||
|     *(.noinit) | ||||
|     . = ALIGN(2); | ||||
|     *(COMMON) | ||||
|     PROVIDE (__noinit_end = .); | ||||
|   } > RAM | ||||
| 
 | ||||
|   _end = .; | ||||
|   PROVIDE (end = .); | ||||
| 
 | ||||
|   .stack (ORIGIN (RAM) + LENGTH(RAM)) : | ||||
|   { | ||||
|     PROVIDE (__stack = .); | ||||
|     *(.stack) | ||||
|   } | ||||
| 
 | ||||
|   .MP430.attributes 0 : | ||||
|   { | ||||
|     KEEP (*(.MSP430.attributes)) | ||||
|     KEEP (*(.gnu.attributes)) | ||||
|     KEEP (*(__TI_build_attributes)) | ||||
|   } | ||||
| 
 | ||||
|   /* The rest are all not normally part of the runtime image.  */ | ||||
| 
 | ||||
|   /* 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 .gnu.linkonce.wi.*) } | ||||
|   .debug_abbrev   0 : { *(.debug_abbrev) } | ||||
|   .debug_line     0 : { *(.debug_line .debug_line.* .debug_line_end ) } | ||||
|   .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) } | ||||
|   /DISCARD/ : { *(.note.GNU-stack) } | ||||
| } | ||||
|  | @ -1,220 +0,0 @@ | |||
| /* Copyright (c) 2013 Red Hat, Inc. All rights reserved. | ||||
| 
 | ||||
|    This copyrighted material is made available to anyone wishing to use, modify, | ||||
|    copy, or redistribute it subject to the terms and conditions of the BSD | ||||
|    License.   This program is distributed in the hope that it will be useful, | ||||
|    but WITHOUT ANY WARRANTY expressed or implied, including the implied warranties | ||||
|    of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  A copy of this license | ||||
|    is available at http://www.opensource.org/licenses. Any Red Hat trademarks that | ||||
|    are incorporated in the source code or documentation are not subject to the BSD | ||||
|    License and may only be used or replicated with the express permission of | ||||
|    Red Hat, Inc. | ||||
| */ | ||||
| 
 | ||||
| /* Default linker script, for normal executables */ | ||||
| OUTPUT_ARCH(msp430) | ||||
| ENTRY(_start) | ||||
| 
 | ||||
| INCLUDE intr_vectors.ld | ||||
| 
 | ||||
| /* Do we need any of these for elf? | ||||
|    __DYNAMIC = 0;    */ | ||||
| 
 | ||||
| MEMORY | ||||
| { | ||||
| 	RAM (w)      : ORIGIN = 0x01c00, LENGTH = 0x04000 | ||||
| 	LOWROM (w)   : ORIGIN = 0x05c00, LENGTH = 0x0a3fe | ||||
| 	RESETVEC (w) : ORIGIN = 0x0fffe, LENGTH = 0x00002 | ||||
| 	ROM (w)      : ORIGIN = 0x10000, LENGTH = 0x35c00 | ||||
| } | ||||
| 
 | ||||
| SECTIONS | ||||
| { | ||||
|   .resetvec : | ||||
|   { | ||||
|     *(.resetvec) | ||||
|   } > RESETVEC | ||||
| 
 | ||||
|   .rodata : { | ||||
|     . = ALIGN(2); | ||||
|     *(.plt) | ||||
|     *(.rodata .rodata.* .gnu.linkonce.r.* .const .const:*) | ||||
|     *(.rodata1) | ||||
|     *(.eh_frame_hdr) | ||||
|     KEEP (*(.eh_frame)) | ||||
|     KEEP (*(.gcc_except_table)) *(.gcc_except_table.*) | ||||
|     PROVIDE (__preinit_array_start = .); | ||||
|     KEEP (*(.preinit_array)) | ||||
|     PROVIDE (__preinit_array_end = .); | ||||
|     PROVIDE (__init_array_start = .); | ||||
|     KEEP (*(SORT(.init_array.*))) | ||||
|     KEEP (*(.init_array)) | ||||
|     PROVIDE (__init_array_end = .); | ||||
|     PROVIDE (__fini_array_start = .); | ||||
|     KEEP (*(.fini_array)) | ||||
|     KEEP (*(SORT(.fini_array.*))) | ||||
|     PROVIDE (__fini_array_end = .); | ||||
|     LONG(0); /* Sentinel.  */ | ||||
| 
 | ||||
|     /* gcc uses crtbegin.o to find the start of the constructors, 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.  */ | ||||
|     KEEP (*crtbegin*.o(.ctors)) | ||||
| 
 | ||||
|     /* We don't want to include the .ctor section from from the | ||||
|        crtend.o file until after the sorted ctors.  The .ctor section | ||||
|        from the crtend file contains the end of ctors marker and it | ||||
|        must be last */ | ||||
|     KEEP (*(EXCLUDE_FILE (*crtend*.o ) .ctors)) | ||||
|     KEEP (*(SORT(.ctors.*))) | ||||
|     KEEP (*(.ctors)) | ||||
| 
 | ||||
|     KEEP (*crtbegin*.o(.dtors)) | ||||
|     KEEP (*(EXCLUDE_FILE (*crtend*.o ) .dtors)) | ||||
|     KEEP (*(SORT(.dtors.*))) | ||||
|     KEEP (*(.dtors)) | ||||
|   } > ROM | ||||
| 
 | ||||
|   .data : { | ||||
|     . = ALIGN(2); | ||||
|     PROVIDE (__datastart = .); | ||||
| 
 | ||||
|     KEEP (*(.jcr)) | ||||
|     *(.data.rel.ro.local) *(.data.rel.ro*) | ||||
|     *(.dynamic) | ||||
| 
 | ||||
|     *(.data .data.* .gnu.linkonce.d.*) | ||||
|     KEEP (*(.gnu.linkonce.d.*personality*)) | ||||
|     SORT(CONSTRUCTORS) | ||||
|     *(.data1) | ||||
|     *(.got.plt) *(.got) | ||||
| 
 | ||||
|     /* We want the small data sections together, so single-instruction offsets | ||||
|        can access them all, and initialized data all before uninitialized, so | ||||
|        we can shorten the on-disk segment size.  */ | ||||
|     . = ALIGN(2); | ||||
|     *(.sdata .sdata.* .gnu.linkonce.s.* D_2 D_1) | ||||
| 
 | ||||
|     . = ALIGN(2); | ||||
|     _edata = .; | ||||
|     PROVIDE (edata = .); | ||||
|     PROVIDE (__dataend = .); | ||||
|   } > RAM AT>ROM | ||||
| 
 | ||||
|   /* Note that crt0 assumes this is a multiple of two; all the | ||||
|      start/stop symbols are also assumed word-aligned.  */ | ||||
|   PROVIDE(__romdatastart = LOADADDR(.data)); | ||||
|   PROVIDE (__romdatacopysize = SIZEOF(.data)); | ||||
| 
 | ||||
|   .bss : { | ||||
|     . = ALIGN(2); | ||||
|     PROVIDE (__bssstart = .); | ||||
|     *(.dynbss) | ||||
|     *(.sbss .sbss.*) | ||||
|     *(.bss .bss.* .gnu.linkonce.b.*) | ||||
|     . = ALIGN(2); | ||||
|     PROVIDE (__bssend = .); | ||||
|   } > RAM | ||||
|   PROVIDE (__bsssize = SIZEOF(.bss)); | ||||
| 
 | ||||
|   /* This section contains data that is not initialised at startup.  */ | ||||
|   .noinit : { | ||||
|     . = ALIGN(2); | ||||
|     PROVIDE (__noinit_start = .); | ||||
|     *(.noinit) | ||||
|     . = ALIGN(2); | ||||
|     *(COMMON) | ||||
|     PROVIDE (__noinit_end = .); | ||||
|   } > RAM | ||||
| 
 | ||||
|   _end = .; | ||||
|   PROVIDE (end = .); | ||||
| 
 | ||||
|   .stack (ORIGIN (RAM) + LENGTH(RAM)) : | ||||
|   { | ||||
|     PROVIDE (__stack = .); | ||||
|     *(.stack) | ||||
|   } | ||||
| 
 | ||||
|   /* This is just for crt0.S */ | ||||
|   .lowtext           : | ||||
|   { | ||||
|     PROVIDE (_start = .); | ||||
|     . = ALIGN(2); | ||||
|     KEEP (*(.crt_init)) | ||||
|     KEEP (*(.crt_bss)) | ||||
|     KEEP (*(.crt_movedata)) | ||||
|     KEEP (*(.crt_main)) | ||||
|     KEEP (*(.lowtext)) | ||||
|   } > LOWROM | ||||
| 
 | ||||
|   .text           : | ||||
|   { | ||||
|     . = ALIGN(2); | ||||
|     *(.text .stub .text.* .gnu.linkonce.t.* .text:*) | ||||
|     KEEP (*(.text.*personality*)) | ||||
|     /* .gnu.warning sections are handled specially by elf32.em.  */ | ||||
|     *(.gnu.warning) | ||||
|     *(.interp .hash .dynsym .dynstr .gnu.version*) | ||||
|     PROVIDE (__etext = .); | ||||
|     PROVIDE (_etext = .); | ||||
|     PROVIDE (etext = .); | ||||
|     . = ALIGN(2); | ||||
|     KEEP (*(.init)) | ||||
|     KEEP (*(.fini)) | ||||
|     KEEP (*(.tm_clone_table)) | ||||
|   } > ROM | ||||
| 
 | ||||
|   /* The rest are all not normally part of the runtime image.  */ | ||||
| 
 | ||||
|   .MP430.attributes 0 : | ||||
|   { | ||||
|     KEEP (*(.MSP430.attributes)) | ||||
|     KEEP (*(.gnu.attributes)) | ||||
|     KEEP (*(__TI_build_attributes)) | ||||
|   } | ||||
| 
 | ||||
|   /* 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 .gnu.linkonce.wi.*) } | ||||
|   .debug_abbrev   0 : { *(.debug_abbrev) } | ||||
|   .debug_line     0 : { *(.debug_line .debug_line.* .debug_line_end ) } | ||||
|   .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) } | ||||
|   /* DWARF 3 */ | ||||
|   .debug_pubtypes 0 : { *(.debug_pubtypes) } | ||||
|   .debug_ranges   0 : { *(.debug_ranges) } | ||||
|   /* DWARF Extension.  */ | ||||
|   .debug_macro    0 : { *(.debug_macro) } | ||||
| 
 | ||||
|   /DISCARD/ : { *(.note.GNU-stack) } | ||||
| } | ||||
|  | @ -1,206 +0,0 @@ | |||
| /* Copyright (c) 2005,2008,2009,2011,2013 Red Hat, Inc. All rights reserved. | ||||
| 
 | ||||
|    This copyrighted material is made available to anyone wishing to use, modify, | ||||
|    copy, or redistribute it subject to the terms and conditions of the BSD | ||||
|    License.   This program is distributed in the hope that it will be useful, | ||||
|    but WITHOUT ANY WARRANTY expressed or implied, including the implied warranties | ||||
|    of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  A copy of this license | ||||
|    is available at http://www.opensource.org/licenses. Any Red Hat trademarks that | ||||
|    are incorporated in the source code or documentation are not subject to the BSD | ||||
|    License and may only be used or replicated with the express permission of | ||||
|    Red Hat, Inc. | ||||
| */ | ||||
| 
 | ||||
| /* Default linker script, for normal executables */ | ||||
| OUTPUT_ARCH(msp430) | ||||
| ENTRY(_start) | ||||
| 
 | ||||
| INCLUDE intr_vectors.ld | ||||
| 
 | ||||
| /* Do we need any of these for elf? | ||||
|    __DYNAMIC = 0;    */ | ||||
| 
 | ||||
| MEMORY | ||||
| { | ||||
| 	RAM (w)      : ORIGIN = 0x01c00, LENGTH = 0x04000 | ||||
| 	ROM (w)      : ORIGIN = 0x05c00, LENGTH = 0x0a3fe | ||||
| 	RESETVEC (w) : ORIGIN = 0x0fffe, LENGTH = 0x00002 | ||||
| } | ||||
| 
 | ||||
| SECTIONS | ||||
| { | ||||
|   .resetvec : | ||||
|   { | ||||
|     *(.resetvec) | ||||
|   } > RESETVEC | ||||
| 
 | ||||
|   .rodata : { | ||||
|     . = ALIGN(2); | ||||
|     *(.plt) | ||||
|     *(.rodata .rodata.* .gnu.linkonce.r.* .const .const:*) | ||||
|     *(.rodata1) | ||||
|     *(.eh_frame_hdr) | ||||
|     KEEP (*(.eh_frame)) | ||||
|     KEEP (*(.gcc_except_table)) *(.gcc_except_table.*) | ||||
|     PROVIDE (__preinit_array_start = .); | ||||
|     KEEP (*(.preinit_array)) | ||||
|     PROVIDE (__preinit_array_end = .); | ||||
|     PROVIDE (__init_array_start = .); | ||||
|     KEEP (*(SORT(.init_array.*))) | ||||
|     KEEP (*(.init_array)) | ||||
|     PROVIDE (__init_array_end = .); | ||||
|     PROVIDE (__fini_array_start = .); | ||||
|     KEEP (*(.fini_array)) | ||||
|     KEEP (*(SORT(.fini_array.*))) | ||||
|     PROVIDE (__fini_array_end = .); | ||||
|     LONG(0); /* Sentinel.  */ | ||||
| 
 | ||||
|     /* gcc uses crtbegin.o to find the start of the constructors, 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.  */ | ||||
|     KEEP (*crtbegin*.o(.ctors)) | ||||
| 
 | ||||
|     /* We don't want to include the .ctor section from from the | ||||
|        crtend.o file until after the sorted ctors.  The .ctor section | ||||
|        from the crtend file contains the end of ctors marker and it | ||||
|        must be last */ | ||||
|     KEEP (*(EXCLUDE_FILE (*crtend*.o ) .ctors)) | ||||
|     KEEP (*(SORT(.ctors.*))) | ||||
|     KEEP (*(.ctors)) | ||||
| 
 | ||||
|     KEEP (*crtbegin*.o(.dtors)) | ||||
|     KEEP (*(EXCLUDE_FILE (*crtend*.o ) .dtors)) | ||||
|     KEEP (*(SORT(.dtors.*))) | ||||
|     KEEP (*(.dtors)) | ||||
|   } > ROM | ||||
| 
 | ||||
|   .text           : | ||||
|   { | ||||
|     . = ALIGN(2); | ||||
|     PROVIDE (_start = .); | ||||
|     KEEP (*(.crt_init)) | ||||
|     KEEP (*(.crt_bss)) | ||||
|     KEEP (*(.crt_movedata)) | ||||
|     KEEP (*(.crt_main)) | ||||
|     KEEP (*(.lowtext)) | ||||
|     *(.text .stub .text.* .gnu.linkonce.t.* .text:*) | ||||
|     KEEP (*(.text.*personality*)) | ||||
|     /* .gnu.warning sections are handled specially by elf32.em.  */ | ||||
|     *(.gnu.warning) | ||||
|     *(.interp .hash .dynsym .dynstr .gnu.version*) | ||||
|     PROVIDE (__etext = .); | ||||
|     PROVIDE (_etext = .); | ||||
|     PROVIDE (etext = .); | ||||
|     . = ALIGN(2); | ||||
|     KEEP (*(.init)) | ||||
|     KEEP (*(.fini)) | ||||
|     KEEP (*(.tm_clone_table)) | ||||
|   } > ROM | ||||
| 
 | ||||
|   .data : { | ||||
|     . = ALIGN(2); | ||||
|     PROVIDE (__datastart = .); | ||||
| 
 | ||||
|     KEEP (*(.jcr)) | ||||
|     *(.data.rel.ro.local) *(.data.rel.ro*) | ||||
|     *(.dynamic) | ||||
| 
 | ||||
|     *(.data .data.* .gnu.linkonce.d.*) | ||||
|     KEEP (*(.gnu.linkonce.d.*personality*)) | ||||
|     SORT(CONSTRUCTORS) | ||||
|     *(.data1) | ||||
|     *(.got.plt) *(.got) | ||||
| 
 | ||||
|     /* We want the small data sections together, so single-instruction offsets | ||||
|        can access them all, and initialized data all before uninitialized, so | ||||
|        we can shorten the on-disk segment size.  */ | ||||
|     . = ALIGN(2); | ||||
|     *(.sdata .sdata.* .gnu.linkonce.s.* D_2 D_1) | ||||
| 
 | ||||
|     . = ALIGN(2); | ||||
|     _edata = .; | ||||
|     PROVIDE (edata = .); | ||||
|     PROVIDE (__dataend = .); | ||||
|   } > RAM AT>ROM | ||||
| 
 | ||||
|   /* Note that crt0 assumes this is a multiple of two; all the | ||||
|      start/stop symbols are also assumed word-aligned.  */ | ||||
|   PROVIDE(__romdatastart = LOADADDR(.data)); | ||||
|   PROVIDE (__romdatacopysize = SIZEOF(.data)); | ||||
| 
 | ||||
|   .bss : { | ||||
|     . = ALIGN(2); | ||||
|     PROVIDE (__bssstart = .); | ||||
|     *(.dynbss) | ||||
|     *(.sbss .sbss.*) | ||||
|     *(.bss .bss.* .gnu.linkonce.b.*) | ||||
|     PROVIDE (__bssend = .); | ||||
|   } > RAM | ||||
|   PROVIDE (__bsssize = SIZEOF(.bss)); | ||||
| 
 | ||||
|   /* This section contains data that is not initialised at startup.  */ | ||||
|   .noinit : { | ||||
|     . = ALIGN(2); | ||||
|     PROVIDE (__noinit_start = .); | ||||
|     *(.noinit) | ||||
|     . = ALIGN(2); | ||||
|     *(COMMON) | ||||
|     PROVIDE (__noinit_end = .); | ||||
|   } > RAM | ||||
| 
 | ||||
|   _end = .; | ||||
|   PROVIDE (end = .); | ||||
| 
 | ||||
|   .stack (ORIGIN (RAM) + LENGTH(RAM)) : | ||||
|   { | ||||
|     PROVIDE (__stack = .); | ||||
|     *(.stack) | ||||
|   } | ||||
| 
 | ||||
|   .MP430.attributes 0 : | ||||
|   { | ||||
|     KEEP (*(.MSP430.attributes)) | ||||
|     KEEP (*(.gnu.attributes)) | ||||
|     KEEP (*(__TI_build_attributes)) | ||||
|   } | ||||
| 
 | ||||
|   /* The rest are all not normally part of the runtime image.  */ | ||||
| 
 | ||||
|   /* 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 .gnu.linkonce.wi.*) } | ||||
|   .debug_abbrev   0 : { *(.debug_abbrev) } | ||||
|   .debug_line     0 : { *(.debug_line .debug_line.* .debug_line_end ) } | ||||
|   .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) } | ||||
|   /DISCARD/ : { *(.note.GNU-stack) } | ||||
| } | ||||
|  | @ -1,27 +1,35 @@ | |||
| /*  Copyright (c) 2013-2014 Red Hat, Inc. All rights reserved. | ||||
| /* Copyright (c) 2013-2015 Red Hat, Inc. All rights reserved. | ||||
| 
 | ||||
|    This copyrighted material is made available to anyone wishing to use, modify, | ||||
|    copy, or redistribute it subject to the terms and conditions of the BSD | ||||
|    License.   This program is distributed in the hope that it will be useful, | ||||
|    but WITHOUT ANY WARRANTY expressed or implied, including the implied warranties | ||||
|    of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  A copy of this license | ||||
|    is available at http://www.opensource.org/licenses. Any Red Hat trademarks that | ||||
|    are incorporated in the source code or documentation are not subject to the BSD | ||||
|    License and may only be used or replicated with the express permission of | ||||
|    Red Hat, Inc.  */ | ||||
|    This copyrighted material is made available to anyone wishing to use, | ||||
|    modify, copy, or redistribute it subject to the terms and conditions of | ||||
|    the BSD License.   This program is distributed in the hope that it will be | ||||
|    useful, but WITHOUT ANY WARRANTY expressed or implied, including the | ||||
|    implied warranties of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | ||||
|    A copy of this license is available at http://www.opensource.org/licenses. | ||||
| 
 | ||||
| /* Default linker script, for large MSP430X executables.  */ | ||||
|    Any Red Hat trademarks that are incorporated in the source code or | ||||
|    documentation are not subject to the BSD License and may only be used or | ||||
|    replicated with the express permission of Red Hat, Inc.  */ | ||||
| 
 | ||||
| /* Example linker script, for large MSP430X executables.  */ | ||||
| 
 | ||||
| OUTPUT_ARCH(msp430) | ||||
| ENTRY(_start) | ||||
| 
 | ||||
| INCLUDE intr_vectors.ld | ||||
| 
 | ||||
| /* Note - These memory regions are just examples.  Real MSP430 MCUs will have | ||||
|    different varieties and sizes of RAM, ROM and FLASH.  Not all devices will | ||||
|    have all of these regions either.  Device specific linker scripts are | ||||
|    provided by TI, so this file is intended to be used as a guide and so that | ||||
|    toolchain tests can be run against the simulator.  */ | ||||
| MEMORY | ||||
| { | ||||
|   RAM (w)      : ORIGIN = 0x00200, LENGTH = 0x01e00 | ||||
|   RAM (rw)     : ORIGIN = 0x00200, LENGTH = 0x01e00 | ||||
|   ROM (rx)     : ORIGIN = 0x02000, LENGTH = 0x0df00 | ||||
|   HIFRAM (rxw) : ORIGIN = 0x10000, LENGTH = 0x80000 | ||||
|   /* The regions from intr_vectors.ld go here.  */ | ||||
|   HIFRAM (rw)  : ORIGIN = 0x10000, LENGTH = 0x80000 | ||||
|   HIROM (rx)   : ORIGIN = 0x90000, LENGTH = 0x70000 | ||||
| } | ||||
| 
 | ||||
| SECTIONS | ||||
|  | @ -31,22 +39,34 @@ SECTIONS | |||
|     *(.resetvec) | ||||
|   } > VECT31 | ||||
| 
 | ||||
|   .upper.rodata : | ||||
|   { | ||||
|     . = ALIGN(2); | ||||
|     *(.upper.rodata.* .upper.rodata) | ||||
|   } > HIFRAM | ||||
| 
 | ||||
|   .rodata : | ||||
|   { | ||||
|     . = ALIGN(2); | ||||
|     *(.plt) | ||||
| 
 | ||||
|     . = ALIGN(2); | ||||
|     *(.lower.rodata.* .lower.rodata) | ||||
| 
 | ||||
|     /* Note: By default we do not have this line: | ||||
| 
 | ||||
|          *(.either.rodata.*) *(.either.rodata) | ||||
| 
 | ||||
|        defined here, or anywhere else in this script.  This is deliberate. | ||||
|        The algorithm in the linker that automatically places rodata into | ||||
|        either the .rodata or the .upper.rodata sections relies upon the | ||||
|        fact that the .either.rodata section is not defined, and that the | ||||
|        .upper.rodata section is defined.  If the .upper.rodata is not | ||||
|        defined in this script then the line above should be restored so that | ||||
|        code compiled with -mdata-region=either enabled will still work. | ||||
| 
 | ||||
|        The same reasoning applies to the absence of definitions for the | ||||
|        .either.text, .either.data and .either.bss sections as well.  */ | ||||
|         | ||||
|     . = ALIGN(2); | ||||
|     *(.rodata .rodata.* .gnu.linkonce.r.* .const .const:*) | ||||
|     *(.rodata1) | ||||
| 
 | ||||
|     *(.eh_frame_hdr) | ||||
|     KEEP (*(.eh_frame)) | ||||
|     . = ALIGN(2); | ||||
|     KEEP (*(.gcc_except_table)) *(.gcc_except_table.*) | ||||
|     PROVIDE (__preinit_array_start = .); | ||||
|     KEEP (*(.preinit_array)) | ||||
|  | @ -61,6 +81,17 @@ SECTIONS | |||
|     PROVIDE (__fini_array_end = .); | ||||
|     LONG(0); /* Sentinel.  */ | ||||
| 
 | ||||
|   } > ROM | ||||
| 
 | ||||
|   /* Note: This is a separate .rodata section for sections which are | ||||
|      read only but which older linkers treat as read-write. | ||||
|      This prevents older linkers from marking the entire .rodata | ||||
|      section as read-write.  */ | ||||
|   .rodata2 : { | ||||
|     . = ALIGN(2); | ||||
|     *(.eh_frame_hdr) | ||||
|     KEEP (*(.eh_frame)) | ||||
| 
 | ||||
|     /* gcc uses crtbegin.o to find the start of the constructors, so | ||||
|        we make sure it is first.  Because this is a wildcard, it | ||||
|        doesn't matter if the user does not actually link against | ||||
|  | @ -83,11 +114,19 @@ SECTIONS | |||
|     KEEP (*(.dtors)) | ||||
|   } > ROM | ||||
| 
 | ||||
|   .upper.data : | ||||
|   .upper.rodata : | ||||
|   { | ||||
|     /* Note: If this section is not defined then please add: | ||||
|      | ||||
|          *(.either.rodata.*) *(.either.rodata) | ||||
| 
 | ||||
|        to the definition of the .rodata section above.  This | ||||
|        will allow code compiled with -mdata-region=either to | ||||
|        work properly.  */ | ||||
| 
 | ||||
|     . = ALIGN(2); | ||||
|     *(.upper.data.* .upper.data) | ||||
|   } > HIFRAM | ||||
|     *(.upper.rodata.* .upper.rodata) | ||||
|   } > HIROM | ||||
| 
 | ||||
|   .data : | ||||
|   { | ||||
|  | @ -100,7 +139,14 @@ SECTIONS | |||
|     *(.data.rel.ro.local) *(.data.rel.ro*) | ||||
|     *(.dynamic) | ||||
| 
 | ||||
|     . = ALIGN(2); | ||||
|     *(.data .data.* .gnu.linkonce.d.*) | ||||
| 
 | ||||
|     /* See the note in .rodata section about why we do not have this line here: | ||||
| 
 | ||||
|         *(.either.data.* .either.data) | ||||
|     */ | ||||
| 
 | ||||
|     KEEP (*(.gnu.linkonce.d.*personality*)) | ||||
|     SORT(CONSTRUCTORS) | ||||
|     *(.data1) | ||||
|  | @ -113,24 +159,109 @@ SECTIONS | |||
|     *(.sdata .sdata.* .gnu.linkonce.s.* D_2 D_1) | ||||
| 
 | ||||
|     . = ALIGN(2); | ||||
| 
 | ||||
|     _edata = .; | ||||
|     PROVIDE (edata = .); | ||||
|     PROVIDE (__dataend = .); | ||||
|   } > RAM | ||||
| 
 | ||||
|   /* Note that crt0 assumes this is a multiple of two; all the | ||||
|      start/stop symbols are also assumed word-aligned.  */ | ||||
|   PROVIDE(__romdatastart = LOADADDR(.data)); | ||||
|   PROVIDE (__romdatacopysize = SIZEOF(.data)); | ||||
|     /* See the comment in the .upper.data section about the need | ||||
|        to copy data from ROM into RAM at program start up.  */ | ||||
|   } > RAM AT> ROM | ||||
| 
 | ||||
|   .upper.bss : | ||||
|   /* Note that crt0 assumes that __romdatacopysize is a multiple of two. | ||||
|      All the start/stop symbols are also assumed to be word-aligned.  */ | ||||
|   __romdatastart = LOADADDR(.data); | ||||
|   __romdatacopysize = SIZEOF(.data); | ||||
| 
 | ||||
|   /* ------------------- start of .upper.data sections.----------------  */ | ||||
|   /* Note: If both HIROM and HIFRAM are available then the .upper.data | ||||
|      section should look like this: | ||||
| 
 | ||||
|         . = ALIGN(2); | ||||
|         .upper.data : | ||||
|         { | ||||
|           __upper_data_init = LOADADDR (.upper.data); | ||||
|           /* Status word.  * / | ||||
|           SHORT(1); | ||||
|           __high_datastart = .; | ||||
|           *(.upper.data.* .upper.data) | ||||
|           __high_dataend = .; | ||||
| 	} > HIFRAM AT> HIROM | ||||
| 
 | ||||
|         __rom_highdatacopysize = SIZEOF(.upper.data) - 2; | ||||
|         __rom_highdatastart = LOADADDR(.upper.data) + 2; | ||||
|    | ||||
|       If only HIFRAM is available then the layout below must look like this: | ||||
| 
 | ||||
|         .upper.data : | ||||
|         { | ||||
|           . = ALIGN(2); | ||||
|           __high_datastart = .; | ||||
|           *(.upper.data.* .upper.data) | ||||
|           __high_dataend = .; | ||||
|         } > HIFRAM | ||||
| 
 | ||||
| 	__rom_highdatacopysize = SIZEOF(.upper.data); | ||||
| 
 | ||||
| 	.shadow.upper.data : | ||||
|         { | ||||
|           . = ALIGN(2); | ||||
|           __upper_data_init = .; | ||||
|           /* Status word.  * / | ||||
|           SHORT(0); | ||||
|           /* Space for the copy of .upper.data.  * / | ||||
|           . = . + SIZEOF(.upper.data) - 2; | ||||
|          } > HIFRAM | ||||
| 
 | ||||
|         __rom_highdatastart = LOADADDR(.shadow.upper.data) + 2; | ||||
| 
 | ||||
|       Note - remove the space in this sequence: * / (twice) when you copy one | ||||
|       of the script fragments above into your script. | ||||
| 
 | ||||
|       Note - the symbols defined here are *not* enclosed by the PROVIDE | ||||
|       keyword.  This is deliberate.  The crt0 library provides weak | ||||
|       definitions of these symbols and those weak definitions *must* be | ||||
|       overriden by the correct values. | ||||
| 
 | ||||
|       The status word is used to control how the .upper.data section | ||||
|       is initialized at application start up.  If the word is non-zero | ||||
|       then data is copied from __rom_highdatastart to __high_datastart. | ||||
|       This corresponds with copying the contents of .upper.data from its | ||||
|       load address (HIROM) to its run-time address (HIFRAM) in the first | ||||
|       scenario, or from the .shadow.upper.section to the .upper.data in | ||||
|       the second scenario. | ||||
| 
 | ||||
|       If the status word is zero then the data is copied the other way | ||||
|       and the word is set to one.  This only happens when the second | ||||
|       scenario is in play, and only the very first time the application | ||||
|       starts running.  This makes sure that the .shadow.upper.data section | ||||
|       contains a pristine copy of the .upper.data section that can be used | ||||
|       to reinitialize the .upper.data section upon device reset. | ||||
| 
 | ||||
|       The status word is necessary as this allows us to have one routine | ||||
|       in crt0 that can handle either form of .upper.data layout.  IE crt0 | ||||
|       is linker script agnostic. | ||||
| 
 | ||||
|       Note - if the .upper.data section is not going to be defined at all | ||||
|       then please add this line back into the .data section above: | ||||
| 
 | ||||
|         *(.either.data.* .either.data) | ||||
|     */ | ||||
| 
 | ||||
|   . = ALIGN(2); | ||||
|   .upper.data : | ||||
|   { | ||||
|     . = ALIGN(2); | ||||
|     PROVIDE (__high_bssstart = .); | ||||
|     *(.upper.bss.* .upper.bss) | ||||
|     PROVIDE (__high_bssend = .); | ||||
|   } > HIFRAM | ||||
|     __upper_data_init = LOADADDR (.upper.data); | ||||
|     /* Status word.  */ | ||||
|     SHORT(1); | ||||
|     __high_datastart = .; | ||||
|     *(.upper.data.* .upper.data) | ||||
|     __high_dataend = .; | ||||
|   } > HIFRAM AT> HIROM | ||||
|    | ||||
|   __rom_highdatacopysize = SIZEOF(.upper.data) - 2; | ||||
|   __rom_highdatastart = LOADADDR(.upper.data) + 2; | ||||
| 
 | ||||
|   /* ------------------- end of .upper.data sections.----------------  */ | ||||
| 
 | ||||
|   .bss : | ||||
|   { | ||||
|  | @ -140,53 +271,87 @@ SECTIONS | |||
|     *(.dynbss) | ||||
|     *(.sbss .sbss.*) | ||||
|     *(.bss .bss.* .gnu.linkonce.b.*) | ||||
|     /* See the note in .rodata section about why we do not have this line here: | ||||
| 
 | ||||
|         *(.either.bss.* .either.bss) | ||||
|     */ | ||||
|     . = ALIGN(2); | ||||
|     *(COMMON) | ||||
|     . = ALIGN(2); | ||||
|     PROVIDE (__bssend = .); | ||||
|   } > RAM | ||||
|   PROVIDE (__bsssize = SIZEOF(.bss)); | ||||
| 
 | ||||
|   /* This section contains data that is not initialised at startup.  */ | ||||
|   /* This section contains data that is not initialised at startup | ||||
|      *or* application reset.  */ | ||||
|   .noinit (NOLOAD) : | ||||
|   { | ||||
|     . = ALIGN(2); | ||||
|     PROVIDE (__noinit_start = .); | ||||
|     *(.noinit) | ||||
|     . = ALIGN(2); | ||||
|     *(COMMON) | ||||
|     PROVIDE (__noinit_end = .); | ||||
|   } > RAM | ||||
| 
 | ||||
|   _end = .; | ||||
|   PROVIDE (end = .); | ||||
|   .upper.bss : | ||||
|   { | ||||
|     /* Note - if this section is not going to be defined then please | ||||
|        add this line back into the definition of the .bss section above: | ||||
|         | ||||
|       *(.either.bss.* .either.bss) | ||||
|     */ | ||||
|     . = ALIGN(2); | ||||
|     __high_bssstart = .; | ||||
|     *(.upper.bss.* .upper.bss) | ||||
|     . = ALIGN(2); | ||||
|     __high_bssend = .; | ||||
|   } > HIFRAM | ||||
| 
 | ||||
|   .stack (ORIGIN (HIFRAM) + LENGTH(HIFRAM)) : | ||||
|   /* We create this section so that "end" will always be in the | ||||
|      HIFRAM region (matching .stack below), even if the .upper.bss | ||||
|      section is empty.  */ | ||||
|   .heap_start : | ||||
|   { | ||||
|     . = ALIGN(2); | ||||
|     _end = .; | ||||
|     PROVIDE (end = .); | ||||
|     LONG(0); | ||||
|   } > HIFRAM | ||||
| 
 | ||||
|   /* Note: We place the stack in HIFRAM because then there is less | ||||
|      chance that it will collide with allocated data in the RAM region. | ||||
|      In scripts targeted at real MCUs however it may be better to place | ||||
|      the stack and heap in RAM, as flash does have a limited number of | ||||
|      writes before failure. | ||||
| 
 | ||||
|      Note - if the location of .stack is changed, then be sure to change | ||||
|      the definition of .heap_start above as well.  */ | ||||
|   .stack (ORIGIN (HIFRAM) + LENGTH (HIFRAM)) : | ||||
|   { | ||||
|     PROVIDE (__stack = .); | ||||
|     *(.stack) | ||||
|   } | ||||
| 
 | ||||
|   /* This is just for crt0.S and interrupt handlers.  */ | ||||
|   .lowtext : | ||||
|   { | ||||
|     PROVIDE (_start = .); | ||||
|     . = ALIGN(2); | ||||
|     KEEP (*(SORT(.crt_*))) | ||||
|     KEEP (*(.lowtext)) | ||||
|   } > ROM | ||||
| 
 | ||||
|   .upper.text : | ||||
|   { | ||||
|     . = ALIGN(2); | ||||
|     *(.upper.text.* .upper.text) | ||||
|   } > HIFRAM | ||||
| 
 | ||||
|   .text : | ||||
|   { | ||||
|     PROVIDE (_start = .); | ||||
| 
 | ||||
|     . = ALIGN(2); | ||||
|     KEEP (*(SORT(.crt_*))) | ||||
| 
 | ||||
|     . = ALIGN(2); | ||||
|     KEEP (*(.lowtext)) | ||||
| 
 | ||||
|     . = ALIGN(2); | ||||
|     *(.lower.text.* .lower.text) | ||||
| 
 | ||||
|     . = ALIGN(2); | ||||
|     *(.text .stub .text.* .gnu.linkonce.t.* .text:*) | ||||
| 
 | ||||
|     /* See the note in .rodata section about why we do not have this line here: | ||||
| 
 | ||||
|         *(.either.text.* .either.text) | ||||
|     */ | ||||
|      | ||||
|     KEEP (*(.text.*personality*)) | ||||
|     /* .gnu.warning sections are handled specially by elf32.em.  */ | ||||
|     *(.gnu.warning) | ||||
|  | @ -200,6 +365,18 @@ SECTIONS | |||
|     KEEP (*(.tm_clone_table)) | ||||
|   } > ROM | ||||
| 
 | ||||
|   .upper.text : | ||||
|   { | ||||
|     /* Note - if this section is not going to be included in the script | ||||
|        then please add this line back into the definition of the .text | ||||
|        section above: | ||||
| 
 | ||||
|        *(.either.text.* .either.text) | ||||
|     */ | ||||
|     . = ALIGN(2); | ||||
|     *(.upper.text.* .upper.text) | ||||
|   } > HIROM | ||||
| 
 | ||||
|   /* The rest are all not normally part of the runtime image.  */ | ||||
| 
 | ||||
|   .MP430.attributes 0 : | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue