196 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			196 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| /* Linker script to configure memory regions. */
 | |
| MEMORY
 | |
| {
 | |
|   FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x20000   /* 128k */
 | |
|   RAM (rwx)  : ORIGIN = 0x20000000, LENGTH = 0x4000    /*  16k */
 | |
| }
 | |
| 
 | |
| /* Library configurations */
 | |
| GROUP(libgcc.a libc.a libm.a libnosys.a)
 | |
| 
 | |
| /* Linker script to place sections and symbol values. Should be used together
 | |
|  * with other linker script that defines memory regions FLASH and RAM.
 | |
|  * It references following symbols, which must be defined in code:
 | |
|  *   Reset_Handler : Entry of reset handler
 | |
|  *
 | |
|  * It defines following symbols, which code can use without definition:
 | |
|  *   __exidx_start
 | |
|  *   __exidx_end
 | |
|  *   __copy_table_start__
 | |
|  *   __copy_table_end__
 | |
|  *   __zero_table_start__
 | |
|  *   __zero_table_end__
 | |
|  *   __etext
 | |
|  *   __data_start__
 | |
|  *   __preinit_array_start
 | |
|  *   __preinit_array_end
 | |
|  *   __init_array_start
 | |
|  *   __init_array_end
 | |
|  *   __fini_array_start
 | |
|  *   __fini_array_end
 | |
|  *   __data_end__
 | |
|  *   __bss_start__
 | |
|  *   __bss_end__
 | |
|  *   __end__
 | |
|  *   end
 | |
|  *   __HeapLimit
 | |
|  *   __StackLimit
 | |
|  *   __StackTop
 | |
|  *   __stack
 | |
|  *   __Vectors_End
 | |
|  *   __Vectors_Size
 | |
|  */
 | |
| ENTRY(Reset_Handler)
 | |
| 
 | |
| SECTIONS
 | |
| {
 | |
| 	.text :
 | |
| 	{
 | |
| 		KEEP(*(.vectors))
 | |
| 		__Vectors_End = .;
 | |
| 		__Vectors_Size = __Vectors_End - __Vectors;
 | |
| 		__end__ = .;
 | |
| 
 | |
| 		*(.text*)
 | |
| 
 | |
| 		KEEP(*(.init))
 | |
| 		KEEP(*(.fini))
 | |
| 
 | |
| 		/* .ctors */
 | |
| 		*crtbegin.o(.ctors)
 | |
| 		*crtbegin?.o(.ctors)
 | |
| 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
 | |
| 		*(SORT(.ctors.*))
 | |
| 		*(.ctors)
 | |
| 
 | |
| 		/* .dtors */
 | |
|  		*crtbegin.o(.dtors)
 | |
|  		*crtbegin?.o(.dtors)
 | |
|  		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
 | |
|  		*(SORT(.dtors.*))
 | |
|  		*(.dtors)
 | |
| 
 | |
| 		*(.rodata*)
 | |
| 
 | |
| 		KEEP(*(.eh_frame*))
 | |
| 	} > FLASH
 | |
| 
 | |
| 	.ARM.extab :
 | |
| 	{
 | |
| 		*(.ARM.extab* .gnu.linkonce.armextab.*)
 | |
| 	} > FLASH
 | |
| 
 | |
| 	__exidx_start = .;
 | |
| 	.ARM.exidx :
 | |
| 	{
 | |
| 		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
 | |
| 	} > FLASH
 | |
| 	__exidx_end = .;
 | |
| 
 | |
| 	/* To copy multiple ROM to RAM sections,
 | |
| 	 * uncomment .copy.table section and,
 | |
| 	 * define __STARTUP_COPY_MULTIPLE in startup_ARMCMx.S */
 | |
| 	/*
 | |
| 	.copy.table :
 | |
| 	{
 | |
| 		. = ALIGN(4);
 | |
| 		__copy_table_start__ = .;
 | |
| 		LONG (__etext)
 | |
| 		LONG (__data_start__)
 | |
| 		LONG (__data_end__ - __data_start__)
 | |
| 		LONG (__etext2)
 | |
| 		LONG (__data2_start__)
 | |
| 		LONG (__data2_end__ - __data2_start__)
 | |
| 		__copy_table_end__ = .;
 | |
| 	} > FLASH
 | |
| 	*/
 | |
| 
 | |
| 	/* To clear multiple BSS sections,
 | |
| 	 * uncomment .zero.table section and,
 | |
| 	 * define __STARTUP_CLEAR_BSS_MULTIPLE in startup_ARMCMx.S */
 | |
| 	/*
 | |
| 	.zero.table :
 | |
| 	{
 | |
| 		. = ALIGN(4);
 | |
| 		__zero_table_start__ = .;
 | |
| 		LONG (__bss_start__)
 | |
| 		LONG (__bss_end__ - __bss_start__)
 | |
| 		LONG (__bss2_start__)
 | |
| 		LONG (__bss2_end__ - __bss2_start__)
 | |
| 		__zero_table_end__ = .;
 | |
| 	} > FLASH
 | |
| 	*/
 | |
| 
 | |
| 	__etext = .;
 | |
| 
 | |
| 	.data : AT (__etext)
 | |
| 	{
 | |
| 		__data_start__ = .;
 | |
| 		*(vtable)
 | |
| 		*(.data*)
 | |
| 
 | |
| 		. = ALIGN(4);
 | |
| 		/* preinit data */
 | |
| 		PROVIDE_HIDDEN (__preinit_array_start = .);
 | |
| 		KEEP(*(.preinit_array))
 | |
| 		PROVIDE_HIDDEN (__preinit_array_end = .);
 | |
| 
 | |
| 		. = ALIGN(4);
 | |
| 		/* init data */
 | |
| 		PROVIDE_HIDDEN (__init_array_start = .);
 | |
| 		KEEP(*(SORT(.init_array.*)))
 | |
| 		KEEP(*(.init_array))
 | |
| 		PROVIDE_HIDDEN (__init_array_end = .);
 | |
| 
 | |
| 
 | |
| 		. = ALIGN(4);
 | |
| 		/* finit data */
 | |
| 		PROVIDE_HIDDEN (__fini_array_start = .);
 | |
| 		KEEP(*(SORT(.fini_array.*)))
 | |
| 		KEEP(*(.fini_array))
 | |
| 		PROVIDE_HIDDEN (__fini_array_end = .);
 | |
| 
 | |
| 		KEEP(*(.jcr*))
 | |
| 		. = ALIGN(4);
 | |
| 		/* All data end */
 | |
| 		__data_end__ = .;
 | |
| 
 | |
| 	} > RAM
 | |
| 
 | |
| 	.bss :
 | |
| 	{
 | |
| 		. = ALIGN(4);
 | |
| 		__bss_start__ = .;
 | |
| 		*(.bss*)
 | |
| 		*(COMMON)
 | |
| 		. = ALIGN(4);
 | |
| 		__bss_end__ = .;
 | |
| 	} > RAM
 | |
| 
 | |
| 	.heap (COPY):
 | |
| 	{
 | |
| 		__HeapBase = .;
 | |
| 		__end__ = .;
 | |
| 		end = __end__;
 | |
| 		KEEP(*(.heap*))
 | |
| 		__HeapLimit = .;
 | |
| 	} > RAM
 | |
| 
 | |
| 	/* .stack_dummy section doesn't contains any symbols. It is only
 | |
| 	 * used for linker to calculate size of stack sections, and assign
 | |
| 	 * values to stack symbols later */
 | |
| 	.stack_dummy (COPY):
 | |
| 	{
 | |
| 		KEEP(*(.stack*))
 | |
| 	} > RAM
 | |
| 
 | |
| 	/* Set stack top to end of RAM, and stack limit move down by
 | |
| 	 * size of stack_dummy section */
 | |
| 	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
 | |
| 	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
 | |
| 	PROVIDE(__stack = __StackTop);
 | |
| 
 | |
| 	/* Check if data + heap + stack exceeds RAM limit */
 | |
| 	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
 | |
| }
 | 
