Home | History | Annotate | Download | only in scripttempl
      1 # Copyright (C) 2014-2016 Free Software Foundation, Inc.
      2 # 
      3 # Copying and distribution of this file, with or without modification,
      4 # are permitted in any medium without royalty provided the copyright
      5 # notice and this notice are preserved.
      6 #
      7 # Unusual variables checked by this code:
      8 #	NOP - four byte opcode for no-op (defaults to 0)
      9 #	DATA_ADDR - if end-of-text-plus-one-page isn't right for data start
     10 #	INITIAL_READONLY_SECTIONS - at start of text segment
     11 #	OTHER_READONLY_SECTIONS - other than .text .init .rodata ...
     12 #		(e.g., .PARISC.milli)
     13 #	OTHER_TEXT_SECTIONS - these get put in .text when relocating
     14 #	OTHER_READWRITE_SECTIONS - other than .data .bss .ctors .sdata ...
     15 #		(e.g., .PARISC.global)
     16 #	ATTRS_SECTIONS - at the end
     17 #	OTHER_SECTIONS - at the end
     18 #	EXECUTABLE_SYMBOLS - symbols that must be defined for an
     19 #		executable (e.g., _DYNAMIC_LINK)
     20 #	TEXT_START_SYMBOLS - symbols that appear at the start of the
     21 #		.text section.
     22 #	DATA_START_SYMBOLS - symbols that appear at the start of the
     23 #		.data section.
     24 #	OTHER_GOT_SYMBOLS - symbols defined just before .got.
     25 #	OTHER_GOT_SECTIONS - sections just after .got.
     26 #	OTHER_SDATA_SECTIONS - sections just after .sdata.
     27 #	OTHER_BSS_SYMBOLS - symbols that appear at the start of the
     28 #		.bss section besides __bss_start.
     29 #	DATA_PLT - .plt should be in data segment, not text segment.
     30 #	BSS_PLT - .plt should be in bss segment
     31 #	TEXT_DYNAMIC - .dynamic in text segment, not data segment.
     32 #	EMBEDDED - whether this is for an embedded system. 
     33 #	SHLIB_TEXT_START_ADDR - if set, add to SIZEOF_HEADERS to set
     34 #		start address of shared library.
     35 #	INPUT_FILES - INPUT command of files to always include
     36 #	WRITABLE_RODATA - if set, the .rodata section should be writable
     37 #	INIT_START, INIT_END -  statements just before and just after
     38 # 	combination of .init sections.
     39 #	FINI_START, FINI_END - statements just before and just after
     40 # 	combination of .fini sections.
     41 #	STACK_ADDR - start of a .stack section.
     42 #	OTHER_SYMBOLS - symbols to place right at the end of the script.
     43 #
     44 # When adding sections, do note that the names of some sections are used
     45 # when specifying the start address of the next.
     46 #
     47 
     48 #  Many sections come in three flavours.  There is the 'real' section,
     49 #  like ".data".  Then there are the per-procedure or per-variable
     50 #  sections, generated by -ffunction-sections and -fdata-sections in GCC,
     51 #  and useful for --gc-sections, which for a variable "foo" might be
     52 #  ".data.foo".  Then there are the linkonce sections, for which the linker
     53 #  eliminates duplicates, which are named like ".gnu.linkonce.d.foo".
     54 #  The exact correspondences are:
     55 #
     56 #  Section	Linkonce section
     57 #  .text	.gnu.linkonce.t.foo
     58 #  .rodata	.gnu.linkonce.r.foo
     59 #  .data	.gnu.linkonce.d.foo
     60 #  .bss		.gnu.linkonce.b.foo
     61 #  .sdata	.gnu.linkonce.s.foo
     62 #  .sbss	.gnu.linkonce.sb.foo
     63 #  .sdata2	.gnu.linkonce.s2.foo
     64 #  .sbss2	.gnu.linkonce.sb2.foo
     65 #  .debug_info	.gnu.linkonce.wi.foo
     66 #  .tdata	.gnu.linkonce.td.foo
     67 #  .tbss	.gnu.linkonce.tb.foo
     68 #
     69 #  Each of these can also have corresponding .rel.* and .rela.* sections.
     70 
     71 test -z "$ENTRY" && ENTRY=_start
     72 test -z "${BIG_OUTPUT_FORMAT}" && BIG_OUTPUT_FORMAT=${OUTPUT_FORMAT}
     73 test -z "${LITTLE_OUTPUT_FORMAT}" && LITTLE_OUTPUT_FORMAT=${OUTPUT_FORMAT}
     74 if [ -z "$MACHINE" ]; then OUTPUT_ARCH=${ARCH}; else OUTPUT_ARCH=${ARCH}:${MACHINE}; fi
     75 test -z "${ELFSIZE}" && ELFSIZE=32
     76 test -z "${ALIGNMENT}" && ALIGNMENT="${ELFSIZE} / 8"
     77 test "$LD_FLAG" = "N" && DATA_ADDR=.
     78 test -n "$CREATE_SHLIB$CREATE_PIE" && test -n "$SHLIB_DATA_ADDR" && COMMONPAGESIZE=""
     79 test -z "$CREATE_SHLIB$CREATE_PIE" && test -n "$DATA_ADDR" && COMMONPAGESIZE=""
     80 test -z "$ATTRS_SECTIONS" && ATTRS_SECTIONS=".gnu.attributes 0 : { KEEP (*(.gnu.attributes)) }"
     81 DATA_SEGMENT_ALIGN="ALIGN(${SEGMENT_SIZE}) + (. & (${MAXPAGESIZE} - 1))"
     82 DATA_SEGMENT_END=""
     83 if test -n "${COMMONPAGESIZE}"; then
     84   DATA_SEGMENT_ALIGN="ALIGN (${SEGMENT_SIZE}) - ((${MAXPAGESIZE} - .) & (${MAXPAGESIZE} - 1)); . = DATA_SEGMENT_ALIGN (${MAXPAGESIZE}, ${COMMONPAGESIZE})"
     85   DATA_SEGMENT_END=". = DATA_SEGMENT_END (.);"
     86 fi
     87  INTERP=".interp    ALIGN(4) : { *(.interp) }"
     88     PLT=".plt            : { *(.plt) } :dynamic :dyn"
     89 DYNAMIC=".dynamic        : { *(.dynamic) } :dynamic :dyn"
     90  RODATA=".rodata    ALIGN(4) : { *(.rodata${RELOCATING+ .rodata.* .gnu.linkonce.r.*}) }"
     91 DISCARDED="/DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.directive)  *(.gnu.lto_*) }"
     92 test -z "$GOT" && GOT=".got          ${RELOCATING-0} : { *(.got.plt) *(.got) } :dynamic :dyn"
     93 INIT_ARRAY=".init_array   ${RELOCATING-0} :
     94   {
     95      ${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (__init_array_start = .);}}
     96      KEEP (*(SORT(.init_array.*)))
     97      KEEP (*(.init_array))
     98      ${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (__init_array_end = .);}}
     99   }"
    100 FINI_ARRAY=".fini_array   ${RELOCATING-0} :
    101   {
    102     ${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (__fini_array_start = .);}}
    103     KEEP (*(SORT(.fini_array.*)))
    104     KEEP (*(.fini_array))
    105     ${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (__fini_array_end = .);}}
    106   }"
    107 CTOR=".ctors     ALIGN(4) : 
    108   {
    109     ${CONSTRUCTING+${CTOR_START}}
    110     /* gcc uses crtbegin.o to find the start of
    111        the constructors, so we make sure it is
    112        first.  Because this is a wildcard, it
    113        doesn't matter if the user does not
    114        actually link against crtbegin.o; the
    115        linker won't look for a file to match a
    116        wildcard.  The wildcard also means that it
    117        doesn't matter which directory crtbegin.o
    118        is in.  */
    119 
    120     KEEP (*crtbegin.o(.ctors))
    121     KEEP (*crtbegin?.o(.ctors))
    122 
    123     /* We don't want to include the .ctor section from
    124        the crtend.o file until after the sorted ctors.
    125        The .ctor section from the crtend file contains the
    126        end of ctors marker and it must be last */
    127 
    128     KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o $OTHER_EXCLUDE_FILES) .ctors))
    129     KEEP (*(SORT(.ctors.*)))
    130     KEEP (*(.ctors))
    131     ${CONSTRUCTING+${CTOR_END}}
    132   } :text"
    133 DTOR=".dtors        ALIGN(4) :
    134   {
    135     ${CONSTRUCTING+${DTOR_START}}
    136     KEEP (*crtbegin.o(.dtors))
    137     KEEP (*crtbegin?.o(.dtors))
    138     KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o $OTHER_EXCLUDE_FILES) .dtors))
    139     KEEP (*(SORT(.dtors.*)))
    140     KEEP (*(.dtors))
    141     ${CONSTRUCTING+${DTOR_END}}
    142   } :text"
    143 STACK="  .stack        ${RELOCATING-0}${RELOCATING+${STACK_ADDR}} :
    144   {
    145     ${RELOCATING+_stack = .;}
    146     *(.stack)
    147   } :data"
    148 
    149 # If this is for an embedded system, don't add SIZEOF_HEADERS.
    150 if [ -z "$EMBEDDED" ]; then
    151    test -z "${TEXT_BASE_ADDRESS}" && TEXT_BASE_ADDRESS="${TEXT_START_ADDR} + SIZEOF_HEADERS"
    152 else
    153    test -z "${TEXT_BASE_ADDRESS}" && TEXT_BASE_ADDRESS="${TEXT_START_ADDR}"
    154 fi
    155 
    156 cat <<EOF
    157 /* Copyright (C) 2014-2016 Free Software Foundation, Inc.
    158 
    159    Copying and distribution of this script, with or without modification,
    160    are permitted in any medium without royalty provided the copyright
    161    notice and this notice are preserved.  */
    162 
    163 OUTPUT_FORMAT("${OUTPUT_FORMAT}", "${BIG_OUTPUT_FORMAT}",
    164 	      "${LITTLE_OUTPUT_FORMAT}")
    165 OUTPUT_ARCH(${OUTPUT_ARCH})
    166 ${RELOCATING+ENTRY(${ENTRY})}
    167 
    168 ${RELOCATING+${LIB_SEARCH_DIRS}}
    169 ${RELOCATING+/* Do we need any of these for elf?
    170    __DYNAMIC = 0; ${STACKZERO+${STACKZERO}} ${SHLIB_PATH+${SHLIB_PATH}}  */}
    171 ${RELOCATING+${EXECUTABLE_SYMBOLS}}
    172 ${RELOCATING+${INPUT_FILES}}
    173 ${RELOCATING- /* For some reason, the Solaris linker makes bad executables
    174   if gld -r is used and the intermediate file has sections starting
    175   at non-zero addresses.  Could be a Solaris ld bug, could be a GNU ld
    176   bug.  But for now assigning the zero vmas works.  */}
    177 
    178 PHDRS
    179 {
    180   headers PT_PHDR PHDRS ;
    181   text    PT_LOAD ;
    182   data    PT_LOAD ;
    183   dyn     PT_LOAD FLAGS (0) ;
    184   dynamic PT_DYNAMIC ;
    185 }
    186 
    187 SECTIONS
    188 {
    189   /* Read-only sections, merged into text segment: */
    190   ${CREATE_SHLIB-${CREATE_PIE-${RELOCATING+. = ${TEXT_BASE_ADDRESS};}}}
    191   ${CREATE_SHLIB+${RELOCATING+. = ${SHLIB_TEXT_START_ADDR:-0};}}
    192   ${CREATE_PIE+${RELOCATING+. = ${SHLIB_TEXT_START_ADDR:-0};}}
    193   ${CREATE_SHLIB-${INTERP}}
    194   
    195   ${INITIAL_READONLY_SECTIONS}
    196 
    197   .init ALIGN(4) : 
    198   { 
    199     ${RELOCATING+${INIT_START}}
    200     KEEP (*(.init))
    201     ${RELOCATING+${INIT_END}}
    202   } :text =${NOP-0}
    203 
    204   .text ALIGN(4) :
    205   {
    206     ${RELOCATING+${TEXT_START_SYMBOLS}}
    207     *(.text .stub${RELOCATING+ .text.* .gnu.linkonce.t.*})
    208     /* .gnu.warning sections are handled specially by elf32.em.  */
    209     *(.gnu.warning)
    210     ${RELOCATING+${OTHER_TEXT_SECTIONS}}
    211   } =${NOP-0}
    212   
    213   ${RELOCATING+${CTOR}}
    214   ${RELOCATING+${DTOR}}
    215   
    216   .fini ALIGN(4) :
    217   {
    218     ${RELOCATING+${FINI_START}}
    219     KEEP (*(.fini))
    220     ${RELOCATING+${FINI_END}}
    221   } =${NOP-0}
    222   
    223   ${RELOCATING+PROVIDE (__etext = .);}
    224   ${RELOCATING+PROVIDE (_etext = .);}
    225   ${RELOCATING+PROVIDE (etext = .);}
    226   
    227   ${WRITABLE_RODATA-${RODATA}}
    228   .rodata1 ALIGN(4) : { *(.rodata1) }
    229   
    230   ExportTable  ALIGN(4) : { KEEP (*(ExportTable)) }
    231   .eh_frame_hdr ALIGN(4) : { *(.eh_frame_hdr) } :text
    232 
    233   /* Adjust the address for the data segment.  We want to adjust up to
    234      the same address within the page on the next page up.  */
    235   . = ALIGN(128) + (. & (128 - 1));
    236   .preinit_array   ${RELOCATING-0} :
    237   {
    238     ${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (__preinit_array_start = .);}}
    239     KEEP (*(.preinit_array))
    240     ${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (__preinit_array_end = .);}}
    241   }
    242   ${RELOCATING+${INIT_ARRAY}}
    243   ${RELOCATING+${FINI_ARRAY}}
    244 
    245   ${CREATE_SHLIB-${CREATE_PIE-${RELOCATING+. = ${DATA_ADDR-${DATA_SEGMENT_ALIGN}};}}}
    246   ${CREATE_SHLIB+${RELOCATING+. = ${SHLIB_DATA_ADDR-${DATA_SEGMENT_ALIGN}};}}
    247   ${CREATE_PIE+${RELOCATING+. = ${SHLIB_DATA_ADDR-${DATA_SEGMENT_ALIGN}};}}
    248 
    249   .data  ALIGN(4) :
    250   {
    251     ${RELOCATING+${DATA_START_SYMBOLS}}
    252     *(.data${RELOCATING+ .data.* .gnu.linkonce.d.*})
    253     ${CONSTRUCTING+SORT(CONSTRUCTORS)}
    254   } :data
    255   
    256   .data1            ALIGN(4) : { *(.data1) } :data
    257   .tdata	    ALIGN(4) : { *(.tdata${RELOCATING+ .tdata.* .gnu.linkonce.td.*}) } :data
    258   .tbss		    ALIGN(4) : { *(.tbss${RELOCATING+ .tbss.* .gnu.linkonce.tb.*})${RELOCATING+ *(.tcommon)} } :data
    259   .eh_frame         ALIGN(4) : { KEEP (*(.eh_frame)) } :data
    260   .gcc_except_table ALIGN(4) : { *(.gcc_except_table) } :data
    261   ${WRITABLE_RODATA+${RODATA}}
    262   ${OTHER_READWRITE_SECTIONS}
    263   ${SDATA}
    264   ${OTHER_SDATA_SECTIONS}
    265   ${RELOCATING+_edata = .;}
    266   ${RELOCATING+PROVIDE (edata = .);}
    267   ${RELOCATING+__bss_start = .;}
    268   ${RELOCATING+${OTHER_BSS_SYMBOLS}}
    269   ${BSS_PLT+${PLT}}
    270   .bss  ALIGN(4) :
    271   {
    272    *(.dynbss)
    273    *(.bss${RELOCATING+ .bss.* .gnu.linkonce.b.*})
    274    *(COMMON)
    275    /* Align here to ensure that the .bss section occupies space up to
    276       _end.  Align after .bss to ensure correct alignment even if the
    277       .bss section disappears because there are no input sections.  */
    278    ${RELOCATING+. = ALIGN(${ALIGNMENT});}
    279   } :data
    280   ${RELOCATING+${OTHER_BSS_END_SYMBOLS}}
    281   ${RELOCATING+. = ALIGN(${ALIGNMENT});}
    282   ${RELOCATING+${OTHER_END_SYMBOLS}}
    283   ${RELOCATING+_end = .;}
    284   ${RELOCATING+PROVIDE (end = .);}
    285   ${RELOCATING+${DATA_SEGMENT_END}}
    286 
    287   ${TEXT_DYNAMIC-${DYNAMIC}}
    288   ${TEXT_DYNAMIC+${DYNAMIC}}
    289   .hash         ${RELOCATING-0} : { *(.hash) } :dynamic :dyn
    290   .dynsym       ${RELOCATING-0} : { *(.dynsym) } :dynamic :dyn
    291   .dynstr       ${RELOCATING-0} : { *(.dynstr) } :dynamic :dyn
    292   ${DATA_PLT-${BSS_PLT-${PLT}}}
    293   .got.plt	  : { *(.got.plt) } :dynamic :dyn
    294   .gnu.version  ${RELOCATING-0} : { *(.gnu.version) }
    295   .gnu.version_d ${RELOCATING-0}: { *(.gnu.version_d) }
    296   .gnu.version_r ${RELOCATING-0}: { *(.gnu.version_r) }
    297 EOF
    298 if [ "x$COMBRELOC" = x ]; then
    299   COMBRELOCCAT=cat
    300 else
    301   COMBRELOCCAT="cat > $COMBRELOC"
    302 fi
    303 eval $COMBRELOCCAT <<EOF
    304   .rel.init     ${RELOCATING-0} : { *(.rel.init) }
    305   .rela.init    ${RELOCATING-0} : { *(.rela.init) }
    306   .rel.text     ${RELOCATING-0} : { *(.rel.text${RELOCATING+ .rel.text.* .rel.gnu.linkonce.t.*}) }
    307   .rela.text    ${RELOCATING-0} : { *(.rela.text${RELOCATING+ .rela.text.* .rela.gnu.linkonce.t.*}) }
    308   .rel.fini     ${RELOCATING-0} : { *(.rel.fini) }
    309   .rela.fini    ${RELOCATING-0} : { *(.rela.fini) }
    310   .rel.rodata   ${RELOCATING-0} : { *(.rel.rodata${RELOCATING+ .rel.rodata.* .rel.gnu.linkonce.r.*}) }
    311   .rela.rodata  ${RELOCATING-0} : { *(.rela.rodata${RELOCATING+ .rela.rodata.* .rela.gnu.linkonce.r.*}) }
    312   ${OTHER_READONLY_RELOC_SECTIONS}
    313   .rel.data     ${RELOCATING-0} : { *(.rel.data${RELOCATING+ .rel.data.* .rel.gnu.linkonce.d.*}) }
    314   .rela.data    ${RELOCATING-0} : { *(.rela.data${RELOCATING+ .rela.data.* .rela.gnu.linkonce.d.*}) }
    315   .rel.tdata	${RELOCATING-0} : { *(.rel.tdata${RELOCATING+ .rel.tdata.* .rel.gnu.linkonce.td.*}) }
    316   .rela.tdata	${RELOCATING-0} : { *(.rela.tdata${RELOCATING+ .rela.tdata.* .rela.gnu.linkonce.td.*}) }
    317   .rel.tbss	${RELOCATING-0} : { *(.rel.tbss${RELOCATING+ .rel.tbss.* .rel.gnu.linkonce.tb.*}) }
    318   .rela.tbss	${RELOCATING-0} : { *(.rela.tbss${RELOCATING+ .rela.tbss.* .rela.gnu.linkonce.tb.*}) }
    319   .rel.ctors    ${RELOCATING-0} : { *(.rel.ctors) }
    320   .rela.ctors   ${RELOCATING-0} : { *(.rela.ctors) }
    321   .rel.dtors    ${RELOCATING-0} : { *(.rel.dtors) }
    322   .rela.dtors   ${RELOCATING-0} : { *(.rela.dtors) }
    323   .rel.got      ${RELOCATING-0} : { *(.rel.got) }
    324   .rela.got     ${RELOCATING-0} : { *(.rela.got) }
    325   ${OTHER_GOT_RELOC_SECTIONS}
    326   .rel.bss      ${RELOCATING-0} : { *(.rel.bss${RELOCATING+ .rel.bss.* .rel.gnu.linkonce.b.*}) }
    327   .rela.bss     ${RELOCATING-0} : { *(.rela.bss${RELOCATING+ .rela.bss.* .rela.gnu.linkonce.b.*}) }
    328 EOF
    329 if [ -n "$COMBRELOC" ]; then
    330 cat <<EOF
    331   .rel.dyn      ${RELOCATING-0} :
    332     {
    333 EOF
    334 sed -e '/^[ 	]*[{}][ 	]*$/d;/:[ 	]*$/d;/\.rela\./d;s/^.*: { *\(.*\)}$/      \1/' $COMBRELOC
    335 cat <<EOF
    336     }
    337   .rela.dyn     ${RELOCATING-0} :
    338     {
    339 EOF
    340 sed -e '/^[ 	]*[{}][ 	]*$/d;/:[ 	]*$/d;/\.rel\./d;s/^.*: { *\(.*\)}/      \1/' $COMBRELOC
    341 cat <<EOF
    342     }
    343 EOF
    344 fi
    345 cat <<EOF
    346   .rel.plt      ${RELOCATING-0} : { *(.rel.plt) }
    347   .rela.plt     ${RELOCATING-0} : { *(.rela.plt) }
    348   ${OTHER_PLT_RELOC_SECTIONS}
    349 
    350 
    351   /* Stabs debugging sections.  */
    352   .stab          0 : { *(.stab) }
    353   .stabstr       0 : { *(.stabstr) }
    354   .stab.excl     0 : { *(.stab.excl) }
    355   .stab.exclstr  0 : { *(.stab.exclstr) }
    356   .stab.index    0 : { *(.stab.index) }
    357   .stab.indexstr 0 : { *(.stab.indexstr) }
    358 
    359   .comment       0 : { *(.comment) }
    360 
    361 EOF
    362 
    363 . $srcdir/scripttempl/DWARF.sc
    364 
    365 cat <<EOF
    366   ${STACK_ADDR+${STACK}}
    367   ${ATTRS_SECTIONS}
    368   ${OTHER_SECTIONS}
    369   ${RELOCATING+${OTHER_SYMBOLS}}
    370   ${RELOCATING+${DISCARDED}}
    371 }
    372 EOF
    373