# Copyright (C) 2014 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 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
