# Copyright (C) 2014-2016 Free Software Foundation, Inc.
# 
# Copying and distribution of this file, with or without modification,
# are permitted in any medium without royalty provided the copyright
# notice and this notice are preserved.

cat <<EOF
/* Copyright (C) 2014-2016 Free Software Foundation, Inc.

   Copying and distribution of this script, with or without modification,
   are permitted in any medium without royalty provided the copyright
   notice and this notice are preserved.  */

OUTPUT_FORMAT(${OUTPUT_FORMAT})
OUTPUT_ARCH(${ARCH})
${RELOCATING+${LIB_SEARCH_DIRS}}

SECTIONS
{
  .text ${RELOCATING:-0} ${RELOCATING+${TEXT_START_ADDR}} : {
    ${RELOCATING+ start = DEFINED(_START) ? _START : DEFINED(_start) ? _start : .;}
    ${RELOCATING+ PROVIDE(__text = .);}
    *(.text);
    *(code);
    *(const);
    *(strings);
    *(pSOS);
    *(pROBE);
    *(pNA);
    *(pHILE);
    *(pREPC);
    *(pRPC);
    ${CONSTRUCTING+ ___CTOR_LIST__ = .;}
    ${CONSTRUCTING+ LONG((___CTOR_END__ - ___CTOR_LIST__) / 4 - 2)}
    ${CONSTRUCTING+ *(.ctors)}
    ${CONSTRUCTING+ LONG(0);}
    ${CONSTRUCTING+ ___CTOR_END__ = .;}
    ${CONSTRUCTING+ ___DTOR_LIST__ = .;}
    ${CONSTRUCTING+ LONG((___DTOR_END__ - ___DTOR_LIST__) / 4 - 2);}
    ${CONSTRUCTING+ *(.dtors);}
    ${CONSTRUCTING+ LONG(0);}
    ${CONSTRUCTING+ ___DTOR_END__ = .;}
    ${RELOCATING+ PROVIDE(__etext = .);}
    ${RELOCATING+ PROVIDE(_etext = .);}
  }
  .data ${RELOCATING:-0} : ${RELOCATING+ AT(ADDR(.text) + SIZEOF(.text))} {
    ${RELOCATING+ PROVIDE(__data = .);}
    *(.data);
    *(vars);
    ${RELOCATING+ PROVIDE(__edata = .);}
    ${RELOCATING+ PROVIDE(_edata = .);}
  }
  .bss ${RELOCATING:-0} :
  { 					
    ${RELOCATING+ PROVIDE(__bss = .);}
    *(.bss);
    *(zerovars);
    *(COMMON);
    ${RELOCATING+ PROVIDE(__ebss = .);}
    ${RELOCATING+ PROVIDE(__end = .);}
    ${RELOCATING+ PROVIDE(_end = .);}
    ${RELOCATING+ PROVIDE(_FreeMemStart = .);}
  }
  .stab 0 ${RELOCATING+(NOLOAD)} : 
  {
    *(.stab);
  }
  .stabstr 0 ${RELOCATING+(NOLOAD)} :
  {
    *(.stabstr);
  }
}
EOF
