Home | History | Annotate | Line # | Download | only in scripttempl
      1 # Linker Script for National Semiconductor's CR16-ELF32.
      2 #
      3 # Copyright (C) 2014-2025 Free Software Foundation, Inc.
      4 #
      5 # Copying and distribution of this file, with or without modification,
      6 # are permitted in any medium without royalty provided the copyright
      7 # notice and this notice are preserved.
      8 
      9 # Using an empty script for ld -r is better than mashing together
     10 # sections.  This hack likely leaves ld -Ur broken.
     11 test -n "${RELOCATING}" || exit 0
     12 
     13 # The next line should be uncommented if it is desired to link
     14 # without libstart.o and directly enter main.
     15 
     16 # ENTRY=_main
     17 
     18 test -z "$ENTRY" && ENTRY=_start
     19 cat <<EOF
     20 
     21 /* Example Linker Script for linking NS CR16 elf32 files.
     22    Copyright (C) 2014-2025 Free Software Foundation, Inc.
     23 
     24    Copying and distribution of this script, with or without modification,
     25    are permitted in any medium without royalty provided the copyright
     26    notice and this notice are preserved.  */
     27 
     28 OUTPUT_FORMAT("${OUTPUT_FORMAT}")
     29 OUTPUT_ARCH(${ARCH})
     30 EOF
     31 
     32 test -n "${RELOCATING}" && cat <<EOF
     33 ENTRY(${ENTRY})
     34 
     35 /* Define memory regions.  */
     36 MEMORY
     37 {
     38 	rom	    : ORIGIN = 0x2,	    LENGTH = 3M
     39 	ram	    : ORIGIN = 4M,	    LENGTH = 10M
     40 }
     41 
     42 EOF
     43 
     44 cat <<EOF
     45 /*  Many sections come in three flavours.  There is the 'real' section,
     46     like ".data".  Then there are the per-procedure or per-variable
     47     sections, generated by -ffunction-sections and -fdata-sections in GCC,
     48     and useful for --gc-sections, which for a variable "foo" might be
     49     ".data.foo".  Then there are the linkonce sections, for which the linker
     50     eliminates duplicates, which are named like ".gnu.linkonce.d.foo".
     51     The exact correspondences are:
     52 
     53     Section	Linkonce section
     54     .text	.gnu.linkonce.t.foo
     55     .rdata	.gnu.linkonce.r.foo
     56     .data	.gnu.linkonce.d.foo
     57     .bss	.gnu.linkonce.b.foo
     58     .debug_info	.gnu.linkonce.wi.foo  */
     59 
     60 SECTIONS
     61 {
     62   .init :
     63   {
     64     __INIT_START = .;
     65     KEEP (*(SORT_NONE(.init)))
     66     __INIT_END = .;
     67   }${RELOCATING+ > rom}
     68 
     69   .fini :
     70   {
     71     __FINI_START = .;
     72     KEEP (*(SORT_NONE(.fini)))
     73     __FINI_END = .;
     74   }${RELOCATING+ > rom}
     75 
     76   .jcr :
     77   {
     78     KEEP (*(.jcr))
     79   }${RELOCATING+ > rom}
     80 
     81   .text :
     82   {
     83     __TEXT_START = .;
     84     *(.text) *(.text.*) *(.gnu.linkonce.t.*)
     85     __TEXT_END = .;
     86   }${RELOCATING+ > rom}
     87 
     88   .rdata :
     89   {
     90     __RDATA_START = .;
     91     *(.rdata_4) *(.rdata_2) *(.rdata_1) *(.rdata.*) *(.gnu.linkonce.r.*) *(.rodata*)
     92     __RDATA_END = .;
     93   }${RELOCATING+ > rom}
     94 
     95   .ctor ALIGN(4) :
     96   {
     97     __CTOR_START = .;
     98     /* The compiler uses crtbegin.o to find the start
     99        of the constructors, so we make sure it is
    100        first.  Because this is a wildcard, it
    101        doesn't matter if the user does not
    102        actually link against crtbegin.o; the
    103        linker won't look for a file to match a
    104        wildcard.  The wildcard also means that it
    105        doesn't matter which directory crtbegin.o
    106        is in.  */
    107 
    108     KEEP (*crtbegin*.o(.ctors))
    109 
    110     /* We don't want to include the .ctor section from
    111        the crtend.o file until after the sorted ctors.
    112        The .ctor section from the crtend file contains the
    113        end of ctors marker and it must be last */
    114 
    115     KEEP (*(EXCLUDE_FILE (*crtend*.o) .ctors))
    116     KEEP (*(SORT(.ctors.*)))
    117     KEEP (*(.ctors))
    118     __CTOR_END = .;
    119   }${RELOCATING+ > rom}
    120 
    121   .dtor ALIGN(4) :
    122   {
    123     __DTOR_START = .;
    124     KEEP (*crtbegin*.o(.dtors))
    125     KEEP (*(EXCLUDE_FILE (*crtend*.o) .dtors))
    126     KEEP (*(SORT(.dtors.*)))
    127     KEEP (*(.dtors))
    128     __DTOR_END = .;
    129   }${RELOCATING+ > rom}
    130 
    131   .data :
    132   {
    133     __DATA_START = .;
    134     *(.data_4) *(.data_2) *(.data_1) *(.data) *(.data.*) *(.gnu.linkonce.d.*)
    135     __DATA_END = .;
    136   }${RELOCATING+ > ram AT > rom}
    137 
    138   .bss (NOLOAD) :
    139   {
    140     __BSS_START = .;
    141     *(.bss_4) *(.bss_2) *(.bss_1) *(.bss) *(COMMON) *(.bss.*) *(.gnu.linkonce.b.*)
    142     __BSS_END = .;
    143   }${RELOCATING+ > ram}
    144 
    145 /* You may change the sizes of the following sections to fit the actual
    146    size your program requires.
    147 
    148    The heap and stack are aligned to the bus width, as a speed optimization
    149    for accessing data located there.  */
    150 
    151   .heap (NOLOAD) :
    152   {
    153     . = ALIGN(4);
    154     __HEAP_START = .;
    155     . += 0x2000; __HEAP_MAX = .;
    156   }${RELOCATING+ > ram}
    157 
    158   .stack (NOLOAD) :
    159   {
    160     . = ALIGN(4);
    161     . += 0x6000;
    162     __STACK_START = .;
    163   }${RELOCATING+ > ram}
    164 
    165   .istack (NOLOAD) :
    166   {
    167     . = ALIGN(4);
    168     . += 0x100;
    169     __ISTACK_START = .;
    170   }${RELOCATING+ > ram}
    171 
    172 EOF
    173 
    174 source_sh $srcdir/scripttempl/misc-sections.sc rom
    175 source_sh $srcdir/scripttempl/DWARF.sc
    176 
    177 cat <<EOF
    178 }
    179 
    180 ${RELOCATING+__DATA_IMAGE_START = LOADADDR(.data);}
    181 EOF
    182