/* * Filename: linker.ld * Micro-Controller: stm32f103c8t6 * Cortex-M3 and Cortex-M4 only need to be 4byte aligned where as * other's might need 8byte or something different. * * The M3/M4 are ARMv7 and ARMv7E-M respectively. */ /* * Program Entry Point: * This part is put into the elf file header. */ ENTRY(Reset_Handler) /* Highest address of user mode stack */ _estack = ORIGIN(RAM) + LENGTH(RAM); /* end of "RAM" Ram type memory */ /* Generate a link error if heap and stack don't fit into RAM */ _Min_Heap_Size = 0x200; /* required amount of heap. */ _Min_Stack_Size = 0x400; /* required amount of stack. */ /* * FORMAT: * R: Read only section. * W: Read/Write section. * X: Executable section. * A: Allocation section. * I: Initialized section. * !: Invert following attribute. */ /* * MEMORY Format: * name [(attr)] : ORIGIN = origin, LENGTH = len */ /* You will want to change these values to match your uC.*/ MEMORY { FLASH(rx): ORIGIN = 0x08000000, LENGTH = 64K SRAM(rwx): ORIGIN = 0x20000000, LENGTH = 20K } /* VMA: virtual memory address.*/ /* LMA: Load memory address. */ floating_point = 0; SECTIONS { /* Code section, mapped to Flash memory */ .text : { KEEP(*(.isr_vector)) /* Vector table, which must be at the beginning of Flash*/ *(.text) /* All code goes here */ *(.rodata) /* Read-only data (e.g., const vars) */ _etext = .; /* Mark the end of text section */ } > FLASH /* Initialized data section, copied from Flash to RAM on startup. */ .data : { _sdata = .; /* Start of data section */ *(.data) /* Initialized data */ _edata = .; /* End of data section */ } > RAM AT > FLASH /* BSS: Placed in SRAM memory types. */ /* Holds all uninitialized globals and static variables.*/ .bss : { _sbss = .; /* Start of BSS */ *(.bss) /* Uninitialized data */ *(COMMON) /* Common symbols (zero-init) */ _ebss = .; /* End of BSS */ } > RAM /* Stack Section: Sizes known at compile time. */ ._stack : { . = ALIGN(8); /* Align to 8-byte boundry */ _estack = .; /* End of stack (top of the stack) */ . = . + 2048; /* Reserve 2KB for stack */ _sstack = .; /*Start of stack */ } > RAM /* Heap Section: Used for dynamic memory allocation. */ .heap : { _sheap = .; /* Start of heap */ . = . + 2048; /* Reserve 2 KB for heap */ _eheap = .; /* End of heap */ } > RAM } /* Provide symbols to be used in the startup code */ PROVIDE(_stack_start = _sstack); PROVIDE(_stack_end = _estack); PROVIDE(_heap_start = _sheap); PROVIDE(_heap_end = _eheap);