| # 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. | 
 | # | 
 | # Unusual variables checked by this code: | 
 | #	NOP - four byte opcode for no-op (defaults to 0) | 
 | #	NO_SMALL_DATA - no .sbss/.sbss2/.sdata/.sdata2 sections if not | 
 | #		empty. | 
 | #	DATA_ADDR - if end-of-text-plus-one-page isn't right for data start | 
 | #	INITIAL_READONLY_SECTIONS - at start of text segment | 
 | #	OTHER_READONLY_SECTIONS - other than .text .init .rodata ... | 
 | #		(e.g., .PARISC.milli) | 
 | #	OTHER_TEXT_SECTIONS - these get put in .text when relocating | 
 | #	OTHER_READWRITE_SECTIONS - other than .data .bss .ctors .sdata ... | 
 | #		(e.g., .PARISC.global) | 
 | #	ATTRS_SECTIONS - at the end | 
 | #	OTHER_SECTIONS - at the end | 
 | #	EXECUTABLE_SYMBOLS - symbols that must be defined for an | 
 | #		executable (e.g., _DYNAMIC_LINK) | 
 | #	TEXT_START_SYMBOLS - symbols that appear at the start of the | 
 | #		.text section. | 
 | #	DATA_START_SYMBOLS - symbols that appear at the start of the | 
 | #		.data section. | 
 | #	OTHER_GOT_SYMBOLS - symbols defined just before .got. | 
 | #	OTHER_GOT_SECTIONS - sections just after .got. | 
 | #	OTHER_SDATA_SECTIONS - sections just after .sdata. | 
 | #	OTHER_BSS_SYMBOLS - symbols that appear at the start of the | 
 | #		.bss section besides __bss_start. | 
 | #	DATA_PLT - .plt should be in data segment, not text segment. | 
 | #	BSS_PLT - .plt should be in bss segment | 
 | #	TEXT_DYNAMIC - .dynamic in text segment, not data segment. | 
 | #	EMBEDDED - whether this is for an embedded system.  | 
 | #	SHLIB_TEXT_START_ADDR - if set, add to SIZEOF_HEADERS to set | 
 | #		start address of shared library. | 
 | #	INPUT_FILES - INPUT command of files to always include | 
 | #	WRITABLE_RODATA - if set, the .rodata section should be writable | 
 | #	INIT_START, INIT_END -  statements just before and just after | 
 | # 	combination of .init sections. | 
 | #	FINI_START, FINI_END - statements just before and just after | 
 | # 	combination of .fini sections. | 
 | #	STACK_ADDR - start of a .stack section. | 
 | #	OTHER_SYMBOLS - symbols to place right at the end of the script. | 
 | # | 
 | # When adding sections, do note that the names of some sections are used | 
 | # when specifying the start address of the next. | 
 | # | 
 |  | 
 | #  Many sections come in three flavours.  There is the 'real' section, | 
 | #  like ".data".  Then there are the per-procedure or per-variable | 
 | #  sections, generated by -ffunction-sections and -fdata-sections in GCC, | 
 | #  and useful for --gc-sections, which for a variable "foo" might be | 
 | #  ".data.foo".  Then there are the linkonce sections, for which the linker | 
 | #  eliminates duplicates, which are named like ".gnu.linkonce.d.foo". | 
 | #  The exact correspondences are: | 
 | # | 
 | #  Section	Linkonce section | 
 | #  .text	.gnu.linkonce.t.foo | 
 | #  .rodata	.gnu.linkonce.r.foo | 
 | #  .data	.gnu.linkonce.d.foo | 
 | #  .bss		.gnu.linkonce.b.foo | 
 | #  .sdata	.gnu.linkonce.s.foo | 
 | #  .sbss	.gnu.linkonce.sb.foo | 
 | #  .sdata2	.gnu.linkonce.s2.foo | 
 | #  .sbss2	.gnu.linkonce.sb2.foo | 
 | #  .debug_info	.gnu.linkonce.wi.foo | 
 | # | 
 | #  Each of these can also have corresponding .rel.* and .rela.* sections. | 
 |  | 
 | test -z "$ENTRY" && ENTRY=_start | 
 | test -z "${BIG_OUTPUT_FORMAT}" && BIG_OUTPUT_FORMAT=${OUTPUT_FORMAT} | 
 | test -z "${LITTLE_OUTPUT_FORMAT}" && LITTLE_OUTPUT_FORMAT=${OUTPUT_FORMAT} | 
 | if [ -z "$MACHINE" ]; then OUTPUT_ARCH=${ARCH}; else OUTPUT_ARCH=${ARCH}:${MACHINE}; fi | 
 | test -z "${ELFSIZE}" && ELFSIZE=32 | 
 | test -z "${ALIGNMENT}" && ALIGNMENT="${ELFSIZE} / 8" | 
 | test -z "$ATTRS_SECTIONS" && ATTRS_SECTIONS=".gnu.attributes 0 : { KEEP (*(.gnu.attributes)) }" | 
 | test "$LD_FLAG" = "N" && DATA_ADDR=. | 
 | INTERP=".interp       ${RELOCATING-0} : { *(.interp) }" | 
 | PLT=".plt          ${RELOCATING-0} : { *(.plt) }" | 
 | DYNAMIC=".dynamic      ${RELOCATING-0} : { *(.dynamic) }" | 
 | RODATA=".rodata       ${RELOCATING-0} : { *(.rodata${RELOCATING+ .rodata.* .gnu.linkonce.r.*}) }" | 
 | if test -z "${NO_SMALL_DATA}"; then | 
 |   SBSS=".sbss         ${RELOCATING-0} : | 
 |   { | 
 |     ${RELOCATING+PROVIDE (__sbss_start = .);} | 
 |     ${RELOCATING+PROVIDE (___sbss_start = .);} | 
 |     *(.dynsbss) | 
 |     *(.sbss${RELOCATING+ .sbss.* .gnu.linkonce.sb.*}) | 
 |     *(.scommon) | 
 |     ${RELOCATING+PROVIDE (__sbss_end = .);} | 
 |     ${RELOCATING+PROVIDE (___sbss_end = .);} | 
 |   }" | 
 |   SBSS2=".sbss2        ${RELOCATING-0} : { *(.sbss2${RELOCATING+ .sbss2.* .gnu.linkonce.sb2.*}) }" | 
 |   SDATA="/* We want the small data sections together, so single-instruction offsets | 
 |      can access them all, and initialized data all before uninitialized, so | 
 |      we can shorten the on-disk segment size.  */ | 
 |   .sdata        ${RELOCATING-0} :  | 
 |   { | 
 |     ${RELOCATING+${SDATA_START_SYMBOLS}} | 
 |     *(.sdata${RELOCATING+ .sdata.* .gnu.linkonce.s.*}) | 
 |   }" | 
 |   SDATA2=".sdata2       ${RELOCATING-0} : { *(.sdata2${RELOCATING+ .sdata2.* .gnu.linkonce.s2.*}) }" | 
 |   REL_SDATA=".rel.sdata    ${RELOCATING-0} : { *(.rel.sdata${RELOCATING+ .rel.sdata.* .rel.gnu.linkonce.s.*}) } | 
 |   .rela.sdata   ${RELOCATING-0} : { *(.rela.sdata${RELOCATING+ .rela.sdata.* .rela.gnu.linkonce.s.*}) }" | 
 |   REL_SBSS=".rel.sbss     ${RELOCATING-0} : { *(.rel.sbss${RELOCATING+ .rel.sbss.* .rel.gnu.linkonce.sb.*}) } | 
 |   .rela.sbss    ${RELOCATING-0} : { *(.rela.sbss${RELOCATING+ .rela.sbss.* .rela.gnu.linkonce.sb.*}) }" | 
 |   REL_SDATA2=".rel.sdata2   ${RELOCATING-0} : { *(.rel.sdata2${RELOCATING+ .rel.sdata2.* .rel.gnu.linkonce.s2.*}) } | 
 |   .rela.sdata2  ${RELOCATING-0} : { *(.rela.sdata2${RELOCATING+ .rela.sdata2.* .rela.gnu.linkonce.s2.*}) }" | 
 |   REL_SBSS2=".rel.sbss2    ${RELOCATING-0} : { *(.rel.sbss2${RELOCATING+ .rel.sbss2.* .rel.gnu.linkonce.sb2.*}) } | 
 |   .rela.sbss2   ${RELOCATING-0} : { *(.rela.sbss2${RELOCATING+ .rela.sbss2.* .rela.gnu.linkonce.sb2.*}) }" | 
 | fi | 
 | CTOR=" | 
 |     ${CONSTRUCTING+${CTOR_START}} | 
 |     /* gcc uses crtbegin.o to find the start of | 
 |        the constructors, so we make sure it is | 
 |        first.  Because this is a wildcard, it | 
 |        doesn't matter if the user does not | 
 |        actually link against crtbegin.o; the | 
 |        linker won't look for a file to match a | 
 |        wildcard.  The wildcard also means that it | 
 |        doesn't matter which directory crtbegin.o | 
 |        is in.  */ | 
 |  | 
 |     KEEP (*crtbegin.o(.ctors)) | 
 |     KEEP (*crtbegin?.o(.ctors)) | 
 |  | 
 |     /* We don't want to include the .ctor section from | 
 |        the crtend.o file until after the sorted ctors. | 
 |        The .ctor section from the crtend file contains the | 
 |        end of ctors marker and it must be last */ | 
 |  | 
 |     KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o $OTHER_EXCLUDE_FILES) .ctors)) | 
 |     KEEP (*(SORT(.ctors.*))) | 
 |     KEEP (*(.ctors)) | 
 |     ${CONSTRUCTING+${CTOR_END}} | 
 | " | 
 | DTOR=" | 
 |     ${CONSTRUCTING+${DTOR_START}} | 
 |     KEEP (*crtbegin.o(.dtors)) | 
 |     KEEP (*crtbegin?.o(.dtors)) | 
 |     KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o $OTHER_EXCLUDE_FILES) .dtors)) | 
 |     KEEP (*(SORT(.dtors.*))) | 
 |     KEEP (*(.dtors)) | 
 |     ${CONSTRUCTING+${DTOR_END}} | 
 | " | 
 | STACK="  .stack        ${RELOCATING-0}${RELOCATING+${STACK_ADDR}} : | 
 |   { | 
 |     ${RELOCATING+_stack = .;} | 
 |     *(.stack) | 
 |   }" | 
 |  | 
 | test -z "${TEXT_BASE_ADDRESS}" && TEXT_BASE_ADDRESS="${TEXT_START_ADDR}" | 
 |  | 
 | 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}", "${BIG_OUTPUT_FORMAT}", | 
 | 	      "${LITTLE_OUTPUT_FORMAT}") | 
 | OUTPUT_ARCH(${OUTPUT_ARCH}) | 
 | ${RELOCATING+ENTRY(${ENTRY})} | 
 |  | 
 | ${RELOCATING+${LIB_SEARCH_DIRS}} | 
 | ${RELOCATING+/* Do we need any of these for elf? | 
 |    __DYNAMIC = 0; ${STACKZERO+${STACKZERO}} ${SHLIB_PATH+${SHLIB_PATH}}  */} | 
 | ${RELOCATING+${EXECUTABLE_SYMBOLS}} | 
 | ${RELOCATING+${INPUT_FILES}} | 
 | ${RELOCATING- /* For some reason, the Solaris linker makes bad executables | 
 |   if gld -r is used and the intermediate file has sections starting | 
 |   at non-zero addresses.  Could be a Solaris ld bug, could be a GNU ld | 
 |   bug.  But for now assigning the zero vmas works.  */} | 
 |  | 
 | SECTIONS | 
 | { | 
 |   /* Read-only sections, merged into text segment: */ | 
 |   ${CREATE_SHLIB-${RELOCATING+. = ${TEXT_BASE_ADDRESS};}} | 
 |   ${CREATE_SHLIB+${RELOCATING+. = ${SHLIB_TEXT_START_ADDR:-0};}} | 
 |   ${CREATE_SHLIB-${INTERP}} | 
 |   ${INITIAL_READONLY_SECTIONS} | 
 |   ${TEXT_DYNAMIC+${DYNAMIC}} | 
 |   .hash         ${RELOCATING-0} : { *(.hash) } | 
 |   .dynsym       ${RELOCATING-0} : { *(.dynsym) } | 
 |   .dynstr       ${RELOCATING-0} : { *(.dynstr) } | 
 |   .gnu.version  ${RELOCATING-0} : { *(.gnu.version) } | 
 |   .gnu.version_d ${RELOCATING-0}: { *(.gnu.version_d) } | 
 |   .gnu.version_r ${RELOCATING-0}: { *(.gnu.version_r) } | 
 |  | 
 | EOF | 
 | if [ "x$COMBRELOC" = x ]; then | 
 |   COMBRELOCCAT=cat | 
 | else | 
 |   COMBRELOCCAT="cat > $COMBRELOC" | 
 | fi | 
 | eval $COMBRELOCCAT <<EOF | 
 |   .rel.init     ${RELOCATING-0} : { *(.rel.init) } | 
 |   .rela.init    ${RELOCATING-0} : { *(.rela.init) } | 
 |   .rel.text     ${RELOCATING-0} : { *(.rel.text${RELOCATING+ .rel.text.* .rel.gnu.linkonce.t.*}) } | 
 |   .rela.text    ${RELOCATING-0} : { *(.rela.text${RELOCATING+ .rela.text.* .rela.gnu.linkonce.t.*}) } | 
 |   .rel.fini     ${RELOCATING-0} : { *(.rel.fini) } | 
 |   .rela.fini    ${RELOCATING-0} : { *(.rela.fini) } | 
 |   .rel.rodata   ${RELOCATING-0} : { *(.rel.rodata${RELOCATING+ .rel.rodata.* .rel.gnu.linkonce.r.*}) } | 
 |   .rela.rodata  ${RELOCATING-0} : { *(.rela.rodata${RELOCATING+ .rela.rodata.* .rela.gnu.linkonce.r.*}) } | 
 |   ${OTHER_READONLY_RELOC_SECTIONS} | 
 |   .rel.data     ${RELOCATING-0} : { *(.rel.data${RELOCATING+ .rel.data.* .rel.gnu.linkonce.d.*}) } | 
 |   .rela.data    ${RELOCATING-0} : { *(.rela.data${RELOCATING+ .rela.data.* .rela.gnu.linkonce.d.*}) } | 
 |   .rel.ctors    ${RELOCATING-0} : { *(.rel.ctors) } | 
 |   .rela.ctors   ${RELOCATING-0} : { *(.rela.ctors) } | 
 |   .rel.dtors    ${RELOCATING-0} : { *(.rel.dtors) } | 
 |   .rela.dtors   ${RELOCATING-0} : { *(.rela.dtors) } | 
 |   .rel.got      ${RELOCATING-0} : { *(.rel.got) } | 
 |   .rela.got     ${RELOCATING-0} : { *(.rela.got) } | 
 |   ${OTHER_GOT_RELOC_SECTIONS} | 
 |   ${REL_SDATA} | 
 |   ${REL_SBSS} | 
 |   ${REL_SDATA2} | 
 |   ${REL_SBSS2} | 
 |   .rel.bss      ${RELOCATING-0} : { *(.rel.bss${RELOCATING+ .rel.bss.* .rel.gnu.linkonce.b.*}) } | 
 |   .rela.bss     ${RELOCATING-0} : { *(.rela.bss${RELOCATING+ .rela.bss.* .rela.gnu.linkonce.b.*}) } | 
 | EOF | 
 | if [ -n "$COMBRELOC" ]; then | 
 | cat <<EOF | 
 |   .rel.dyn      ${RELOCATING-0} : | 
 |     { | 
 | EOF | 
 | sed -e '/^[ 	]*[{}][ 	]*$/d;/:[ 	]*$/d;/\.rela\./d;s/^.*: { *\(.*\)}$/      \1/' $COMBRELOC | 
 | cat <<EOF | 
 |     } | 
 |   .rela.dyn     ${RELOCATING-0} : | 
 |     { | 
 | EOF | 
 | sed -e '/^[ 	]*[{}][ 	]*$/d;/:[ 	]*$/d;/\.rel\./d;s/^.*: { *\(.*\)}/      \1/' $COMBRELOC | 
 | cat <<EOF | 
 |     } | 
 | EOF | 
 | fi | 
 | cat <<EOF | 
 |   . = ALIGN(0x1000); | 
 |   .rel.plt      ${RELOCATING-0} : { *(.rel.plt) } | 
 |   .rela.plt     ${RELOCATING-0} : { *(.rela.plt) } | 
 |   ${OTHER_PLT_RELOC_SECTIONS} | 
 |   ${DATA_PLT-${BSS_PLT-${PLT}}} | 
 |   .text         ${RELOCATING-0} : | 
 |   { | 
 |     ${RELOCATING+${TEXT_START_SYMBOLS}} | 
 |     *(.text .stub${RELOCATING+ .text.* .gnu.linkonce.t.*}) | 
 |     /* .gnu.warning sections are handled specially by elf32.em.  */ | 
 |     *(.gnu.warning) | 
 |     ${RELOCATING+${OTHER_TEXT_SECTIONS}} | 
 |   } =${NOP-0} | 
 |   .fini         ${RELOCATING-0} : | 
 |   { | 
 |     ${RELOCATING+${FINI_START}} | 
 |     KEEP (*(.fini)) | 
 |     ${RELOCATING+${FINI_END}} | 
 |   } =${NOP-0} | 
 |   ${RELOCATING+PROVIDE (__etext = .);} | 
 |   ${RELOCATING+PROVIDE (_etext = .);} | 
 |   ${RELOCATING+PROVIDE (etext = .);} | 
 |   . = ALIGN(0x1000); | 
 |   ${CREATE_SHLIB-${SDATA2}} | 
 |   ${CREATE_SHLIB-${SBSS2}} | 
 |   ${OTHER_READONLY_SECTIONS} | 
 |   .eh_frame_hdr : { *(.eh_frame_hdr) } | 
 |  | 
 |   . = ALIGN(0x1000); | 
 |   .data         ${RELOCATING-0} : | 
 |   { | 
 |     *(.rodata .rodata.*) | 
 |     *(.rodata1) | 
 |     *(.gnu.linkonce.r.*) | 
 |     ${RELOCATING+${DATA_START_SYMBOLS}} | 
 |     *(.data${RELOCATING+ .data.* .gnu.linkonce.d.*}) | 
 |     ${CONSTRUCTING+SORT(CONSTRUCTORS)} | 
 |     KEEP (*(.eh_frame)) | 
 |     *(.gcc_except_table) | 
 |     ${CTOR} | 
 |     ${DTOR} | 
 |     KEEP (*(.jcr)) | 
 |   } | 
 |   .data1        ${RELOCATING-0} : { *(.data1) } | 
 |   . = ALIGN(0x1000); | 
 |   .gcc_except_table ${RELOCATING-0} : { *(.gcc_except_table) } | 
 |   ${WRITABLE_RODATA+${RODATA}} | 
 |   ${OTHER_READWRITE_SECTIONS} | 
 |   ${TEXT_DYNAMIC-${DYNAMIC}} | 
 |   ${DATA_PLT+${PLT}} | 
 |   ${RELOCATING+${OTHER_GOT_SYMBOLS}} | 
 |   .got          ${RELOCATING-0} : { *(.got.plt) *(.got) } | 
 |   ${OTHER_GOT_SECTIONS} | 
 |   ${CREATE_SHLIB+${SDATA2}} | 
 |   ${CREATE_SHLIB+${SBSS2}} | 
 |   ${SDATA} | 
 |   ${OTHER_SDATA_SECTIONS} | 
 |   ${RELOCATING+_edata = .;} | 
 |   ${RELOCATING+PROVIDE (edata = .);} | 
 |   ${RELOCATING+__bss_start = .;} | 
 |   ${RELOCATING+${OTHER_BSS_SYMBOLS}} | 
 |   ${SBSS} | 
 |   ${BSS_PLT+${PLT}} | 
 |   . = ALIGN(0x1000); | 
 |   .bss          ${RELOCATING-0} : | 
 |   { | 
 |    *(.dynbss) | 
 |    *(.bss${RELOCATING+ .bss.* .gnu.linkonce.b.*}) | 
 |    *(COMMON) | 
 |    /* Align here to ensure that the .bss section occupies space up to | 
 |       _end.  Align after .bss to ensure correct alignment even if the | 
 |       .bss section disappears because there are no input sections.  */ | 
 |    ${RELOCATING+. = ALIGN(${ALIGNMENT});} | 
 |   } | 
 |   ${RELOCATING+${OTHER_BSS_END_SYMBOLS}} | 
 |   ${RELOCATING+. = ALIGN(${ALIGNMENT});} | 
 |   ${RELOCATING+${OTHER_END_SYMBOLS}} | 
 |   ${RELOCATING+_end = .;} | 
 |   ${RELOCATING+PROVIDE (end = .);} | 
 |  | 
 |   /* Stabs debugging sections.  */ | 
 |   . = ALIGN(0x1000); | 
 |   .stab          0 : { *(.stab) } | 
 |   .stabstr       0 : { *(.stabstr) } | 
 |   .stab.excl     0 : { *(.stab.excl) } | 
 |   .stab.exclstr  0 : { *(.stab.exclstr) } | 
 |   .stab.index    0 : { *(.stab.index) } | 
 |   .stab.indexstr 0 : { *(.stab.indexstr) } | 
 |  | 
 |   . = ALIGN(0x1000); | 
 |   .comment       0 : { *(.comment) } | 
 |  | 
 | EOF | 
 |  | 
 | . $srcdir/scripttempl/DWARF.sc | 
 |  | 
 | cat <<EOF | 
 |   ${STACK_ADDR+${STACK}} | 
 |   ${ATTRS_SECTIONS} | 
 |   ${OTHER_SECTIONS} | 
 |   ${RELOCATING+${OTHER_SYMBOLS}} | 
 | } | 
 | EOF |