text: /*
  ******************************************************************************
  **
  
  **  File        : LinkerScript.ld
  **
  **
  **  Abstract    : Linker script for STM32H7 series
  **                128Kbytes RAM_EXEC and 160Kbytes RAM
  **
  **                Set heap size, stack size and stack location according
  **                to application requirements.
  **
  **                Set memory bank area and size if external memory is used.
  **
  **  Target      : STMicroelectronics STM32
  **
  **  Distribution: The file is distributed “as is,” without any warranty
  **                of any kind.
  **
  *****************************************************************************
  ** @attention
  **
  ** Copyright (c) 2019 STMicroelectronics.
  ** All rights reserved.
  **
  ** This software component is licensed by ST under BSD 3-Clause license,
  ** the "License"; You may not use this file except in compliance with the
  ** License. You may obtain a copy of the License at:
  **                        opensource.org/licenses/BSD-3-Clause
  **
  ****************************************************************************
  */
  
  /* Entry Point */
  ENTRY(Reset_Handler)
  
  /* Highest address of the user mode stack */
  _estack = 0x10048000;    /* end of RAM */
  /* 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 */
  
  /* Specify the memory areas */
  MEMORY
  {
  RAM_EXEC (rx)      : ORIGIN = 0x10000000, LENGTH = 128K
  RAM (xrw)      : ORIGIN = 0x10020000, LENGTH = 160K
  }
  
  /* Define output sections */
  SECTIONS
  {
    /* The startup code goes first into RAM_EXEC */
    .isr_vector :
    {
      . = ALIGN(4);
      KEEP(*(.isr_vector)) /* Startup code */
      . = ALIGN(4);
    } >RAM_EXEC
  
    /* The program code and other data goes into RAM_EXEC */
    .text :
    {
      . = ALIGN(4);
      *(.text)           /* .text sections (code) */
      *(.text*)          /* .text* sections (code) */
      *(.glue_7)         /* glue arm to thumb code */
      *(.glue_7t)        /* glue thumb to arm code */
      *(.eh_frame)
  
      KEEP (*(.init))
      KEEP (*(.fini))
  
      . = ALIGN(4);
      _etext = .;        /* define a global symbols at end of code */
    } >RAM_EXEC
  
    /* Constant data goes into RAM_EXEC */
    .rodata :
    {
      . = ALIGN(4);
      *(.rodata)         /* .rodata sections (constants, strings, etc.) */
      *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */
      . = ALIGN(4);
    } >RAM_EXEC
  
    .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >RAM_EXEC
    .ARM : {
      __exidx_start = .;
      *(.ARM.exidx*)
      __exidx_end = .;
    } >RAM_EXEC
  
    .preinit_array     :
    {
      PROVIDE_HIDDEN (__preinit_array_start = .);
      KEEP (*(.preinit_array*))
      PROVIDE_HIDDEN (__preinit_array_end = .);
    } >RAM_EXEC
    .init_array :
    {
      PROVIDE_HIDDEN (__init_array_start = .);
      KEEP (*(SORT(.init_array.*)))
      KEEP (*(.init_array*))
      PROVIDE_HIDDEN (__init_array_end = .);
    } >RAM_EXEC
    .fini_array :
    {
      PROVIDE_HIDDEN (__fini_array_start = .);
      KEEP (*(SORT(.fini_array.*)))
      KEEP (*(.fini_array*))
      PROVIDE_HIDDEN (__fini_array_end = .);
    } >RAM_EXEC
  
    /* used by the startup to initialize data */
    _sidata = LOADADDR(.data);
  
    /* Initialized data sections goes into RAM, load LMA copy after code */
    .data : 
    {
      . = ALIGN(4);
      _sdata = .;        /* create a global symbol at data start */
      *(.data)           /* .data sections */
      *(.data*)          /* .data* sections */
  
      . = ALIGN(4);
      _edata = .;        /* define a global symbol at data end */
    } >RAM AT> RAM_EXEC
  
    
    /* Uninitialized data section */
    . = ALIGN(4);
    .bss :
    {
      /* This is used by the startup in order to initialize the .bss secion */
      _sbss = .;         /* define a global symbol at bss start */
      __bss_start__ = _sbss;
      *(.bss)
      *(.bss*)
      *(COMMON)
  
      . = ALIGN(4);
      _ebss = .;         /* define a global symbol at bss end */
      __bss_end__ = _ebss;
    } >RAM
  
    /* User_heap_stack section, used to check that there is enough RAM left */
    ._user_heap_stack :
    {
      . = ALIGN(8);
      PROVIDE ( end = . );
      PROVIDE ( _end = . );
      . = . + _Min_Heap_Size;
      . = . + _Min_Stack_Size;
      . = ALIGN(8);
    } >RAM
  
    
  
    /* Remove information from the standard libraries */
    /DISCARD/ :
    {
      libc.a ( * )
      libm.a ( * )
      libgcc.a ( * )
    }
  
    .ARM.attributes 0 : { *(.ARM.attributes) }
  }
  
  
  