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