text: /**
   * \file
   *
   * \brief Linker script for running in internal FLASH on the SAMD21G18A
   *
   * Copyright (c) 2017 Microchip Technology Inc.
   *
   * \asf_license_start
   *
   * \page License
   *
   * SPDX-License-Identifier: Apache-2.0
   *
   * Licensed under the Apache License, Version 2.0 (the "License"); you may
   * not use this file except in compliance with the License.
   * You may obtain a copy of the Licence at
   *
   * http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an AS IS BASIS, WITHOUT
   * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   *
   * \asf_license_stop
   *
   */
  
  
  OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
  OUTPUT_ARCH(arm)
  SEARCH_DIR(.)
  
  /* Memory Spaces Definitions */
  MEMORY
  {
    rom      (rx)  : ORIGIN = 0x00000000 + 8K, LENGTH = 0x00040000 - 8K  /* 8K offset to preserve bootloader */
    ram      (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000
  }
  
  /* The stack size used by the application. NOTE: you need to adjust according to your application. */
  STACK_SIZE = DEFINED(STACK_SIZE) ? STACK_SIZE : DEFINED(__stack_size__) ? __stack_size__ : 0x2000;
  
  ENTRY(Reset_Handler)
  
  /* Section Definitions */
  SECTIONS
  {
      .text :
      {
          . = ALIGN(4);
          _sfixed = .;
          KEEP(*(.vectors .vectors.*))
          *(.text .text.* .gnu.linkonce.t.*)
          *(.glue_7t) *(.glue_7)
          *(.rodata .rodata* .gnu.linkonce.r.*)
          *(.ARM.extab* .gnu.linkonce.armextab.*)
  
          /* Support C constructors, and C destructors in both user code
             and the C library. This also provides support for C++ code. */
          . = 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(4);
          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))
  
          . = ALIGN(4);
          _efixed = .;            /* End of text section */
      } > rom
  
      /* .ARM.exidx is sorted, so has to go in its own output section.  */
      PROVIDE_HIDDEN (__exidx_start = .);
      .ARM.exidx :
      {
        *(.ARM.exidx* .gnu.linkonce.armexidx.*)
      } > rom
      PROVIDE_HIDDEN (__exidx_end = .);
  
      . = ALIGN(4);
      _etext = .;
  
      .relocate : AT (_etext)
      {
          . = ALIGN(4);
          _srelocate = .;
          *(.ramfunc .ramfunc.*);
          *(.data .data.*);
          . = ALIGN(4);
          _erelocate = .;
      } > ram
  
      /* .bss section which is used for uninitialized data */
      .bss (NOLOAD) :
      {
          . = ALIGN(4);
          _sbss = . ;
          _szero = .;
          *(.bss .bss.*)
          *(COMMON)
          . = ALIGN(4);
          _ebss = . ;
          _ezero = .;
          end = .;
      } > ram
  
      /* stack section */
      .stack (NOLOAD):
      {
          . = ALIGN(8);
          _sstack = .;
          . = . + STACK_SIZE;
          . = ALIGN(8);
          _estack = .;
      } > ram
  
      . = ALIGN(4);
      _end = . ;
  }
  