mirror of
				https://github.com/pascallanger/DIY-Multiprotocol-TX-Module.git
				synced 2025-10-31 03:14:16 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			220 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			220 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
|  * Linker script for libmaple.
 | |
|  *
 | |
|  * Original author "lanchon" from ST forums, with modifications by LeafLabs.
 | |
|  */
 | |
| 
 | |
| OUTPUT_FORMAT ("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
 | |
| 
 | |
| /*
 | |
|  * Configure other libraries we want in the link.
 | |
|  *
 | |
|  * libgcc, libc, and libm are common across supported toolchains.
 | |
|  * However, some toolchains require additional archives which aren't
 | |
|  * present everywhere (e.g. ARM's gcc-arm-embedded releases).
 | |
|  *
 | |
|  * To hack around this, we let the build system specify additional
 | |
|  * archives by putting the right extra_libs.inc (in a directory under
 | |
|  * toolchains/) in our search path.
 | |
|  */
 | |
| GROUP(libgcc.a libc.a libm.a)
 | |
| INCLUDE extra_libs.inc
 | |
| 
 | |
| /*
 | |
|  * These force the linker to search for vector table symbols.
 | |
|  *
 | |
|  * These symbols vary by STM32 family (and also within families).
 | |
|  * It's up to the build system to configure the link's search path
 | |
|  * properly for the target MCU.
 | |
|  */
 | |
| INCLUDE vector_symbols.inc
 | |
| 
 | |
| /* STM32 vector table. */
 | |
| EXTERN(__stm32_vector_table)
 | |
| 
 | |
| /* C runtime initialization function. */
 | |
| EXTERN(start_c)
 | |
| 
 | |
| /* main entry point */
 | |
| EXTERN(main)
 | |
| 
 | |
| /* Initial stack pointer value. */
 | |
| EXTERN(__msp_init)
 | |
| PROVIDE(__msp_init = ORIGIN(ram) + LENGTH(ram));
 | |
| 
 | |
| /* Reset vector and chip reset entry point */
 | |
| EXTERN(__start__)
 | |
| ENTRY(__start__)
 | |
| PROVIDE(__exc_reset = __start__);
 | |
| 
 | |
| /* Heap boundaries, for libmaple */
 | |
| EXTERN(_lm_heap_start);
 | |
| EXTERN(_lm_heap_end);
 | |
| 
 | |
| SECTIONS
 | |
| {
 | |
|     .text :
 | |
|       {
 | |
|         __text_start__ = .;
 | |
|         /*
 | |
|          * STM32 vector table.  Leave this here.  Yes, really.
 | |
|          */
 | |
|         *(.stm32.interrupt_vector)
 | |
| 
 | |
|         /*
 | |
|          * Program code and vague linking
 | |
|          */
 | |
|         *(.text .text.* .gnu.linkonce.t.*)
 | |
|         *(.plt)
 | |
|         *(.gnu.warning)
 | |
|         *(.glue_7t) *(.glue_7) *(.vfp11_veneer)
 | |
| 
 | |
|         *(.ARM.extab* .gnu.linkonce.armextab.*)
 | |
|         *(.gcc_except_table)
 | |
|         *(.eh_frame_hdr)
 | |
|         *(.eh_frame)
 | |
| 
 | |
|         . = ALIGN(4);
 | |
|         KEEP(*(.init))
 | |
| 
 | |
|         . = ALIGN(4);
 | |
|         __preinit_array_start = .;
 | |
|         KEEP (*(.preinit_array))
 | |
|         __preinit_array_end = .;
 | |
| 
 | |
|         . = ALIGN(4);
 | |
|         __init_array_start = .;
 | |
|         KEEP (*(SORT(.init_array.*)))
 | |
|         KEEP (*(.init_array))
 | |
|         __init_array_end = .;
 | |
| 
 | |
|         . = ALIGN(0x4);
 | |
|         KEEP (*crtbegin.o(.ctors))
 | |
|         KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))
 | |
|         KEEP (*(SORT(.ctors.*)))
 | |
|         KEEP (*crtend.o(.ctors))
 | |
| 
 | |
|         . = ALIGN(4);
 | |
|         KEEP(*(.fini))
 | |
| 
 | |
|         . = ALIGN(4);
 | |
|         __fini_array_start = .;
 | |
|         KEEP (*(.fini_array))
 | |
|         KEEP (*(SORT(.fini_array.*)))
 | |
|         __fini_array_end = .;
 | |
| 
 | |
|         KEEP (*crtbegin.o(.dtors))
 | |
|         KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))
 | |
|         KEEP (*(SORT(.dtors.*)))
 | |
|         KEEP (*crtend.o(.dtors))
 | |
|       } > REGION_TEXT
 | |
| 
 | |
|     /*
 | |
|      * End of text
 | |
|      */
 | |
|     .text.align :
 | |
|       {
 | |
|         . = ALIGN(8);
 | |
|         __text_end__ = .;
 | |
|       } > REGION_TEXT
 | |
| 
 | |
|     /*
 | |
|      * .ARM.exidx exception unwinding; mandated by ARM's C++ ABI
 | |
|      */
 | |
|     __exidx_start = .;
 | |
|     .ARM.exidx :
 | |
|       {
 | |
|         *(.ARM.exidx* .gnu.linkonce.armexidx.*)
 | |
|       } > REGION_RODATA
 | |
|     __exidx_end = .;
 | |
| 
 | |
|     /*
 | |
|      * .data
 | |
|      */
 | |
|     .data :
 | |
|       {
 | |
|         . = ALIGN(8);
 | |
|         __data_start__ = .;
 | |
| 
 | |
|         *(.got.plt) *(.got)
 | |
|         *(.data .data.* .gnu.linkonce.d.*)
 | |
| 
 | |
|         . = ALIGN(8);
 | |
|         __data_end__ = .;
 | |
|       } > REGION_DATA AT> REGION_RODATA
 | |
| 
 | |
|     /*
 | |
|      * Read-only data
 | |
|      */
 | |
|     .rodata :
 | |
|       {
 | |
|         *(.rodata .rodata.* .gnu.linkonce.r.*)
 | |
|         /* .USER_FLASH: We allow users to allocate into Flash here */
 | |
|         *(.USER_FLASH)
 | |
|         /* ROM image configuration; for C startup */
 | |
|         . = ALIGN(4);
 | |
|         _lm_rom_img_cfgp = .;
 | |
|         LONG(LOADADDR(.data));
 | |
|         /*
 | |
|          * Heap: Linker scripts may choose a custom heap by overriding
 | |
|          * _lm_heap_start and _lm_heap_end. Otherwise, the heap is in
 | |
|          * internal SRAM, beginning after .bss, and growing towards
 | |
|          * the stack.
 | |
|          *
 | |
|          * I'm shoving these here naively; there's probably a cleaner way
 | |
|          * to go about this. [mbolivar]
 | |
|          */
 | |
|         _lm_heap_start = DEFINED(_lm_heap_start) ? _lm_heap_start : _end;
 | |
|         _lm_heap_end   = DEFINED(_lm_heap_end) ? _lm_heap_end : __msp_init;
 | |
|       } > REGION_RODATA
 | |
| 
 | |
|     /*
 | |
|      * .bss
 | |
|      */
 | |
|     .bss :
 | |
|       {
 | |
|         . = ALIGN(8);
 | |
|         __bss_start__ = .;
 | |
|         *(.bss .bss.* .gnu.linkonce.b.*)
 | |
|         *(COMMON)
 | |
|         . = ALIGN (8);
 | |
|         __bss_end__ = .;
 | |
|         _end = __bss_end__;
 | |
|       } > REGION_BSS
 | |
| 
 | |
|     /*
 | |
|      * Debugging sections
 | |
|      */
 | |
|     .stab 0 (NOLOAD) : { *(.stab) }
 | |
|     .stabstr 0 (NOLOAD) : { *(.stabstr) }
 | |
|     /* 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_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) }
 | |
| 
 | |
|     .note.gnu.arm.ident 0 : { KEEP (*(.note.gnu.arm.ident)) }
 | |
|     .ARM.attributes 0 : { KEEP (*(.ARM.attributes)) }
 | |
|     /DISCARD/ : { *(.note.GNU-stack) }
 | |
| }
 |