1/* 2 3Copyright (c) 2005,2008,2009,2011 Red Hat Incorporated. 4All rights reserved. 5 6Redistribution and use in source and binary forms, with or without 7modification, are permitted provided that the following conditions are met: 8 9 Redistributions of source code must retain the above copyright 10 notice, this list of conditions and the following disclaimer. 11 12 Redistributions in binary form must reproduce the above copyright 13 notice, this list of conditions and the following disclaimer in the 14 documentation and/or other materials provided with the distribution. 15 16 The name of Red Hat Incorporated may not be used to endorse 17 or promote products derived from this software without specific 18 prior written permission. 19 20THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 21AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 23DISCLAIMED. IN NO EVENT SHALL RED HAT INCORPORATED BE LIABLE FOR ANY 24DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 25(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 26LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 27ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 29SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 31*/ 32 33/* Default linker script, for normal executables */ 34OUTPUT_ARCH(rl78) 35ENTRY(_start) 36 37/* Do we need any of these for elf? 38 __DYNAMIC = 0; */ 39 40/* This is for an RL78/G13, 64k flash, 4k ram */ 41MEMORY { 42 VEC (r) : ORIGIN = 0x00000, LENGTH = 0x00002 43 IVEC (r) : ORIGIN = 0x00004, LENGTH = 0x0007c 44 OPT (r) : ORIGIN = 0x000c0, LENGTH = 0x00004 45 ROM (r) : ORIGIN = 0x000d8, LENGTH = 0x0ff28 46/* The G10 variant needs to use RAM for virtual registers. */ 47 RAM (w) : ORIGIN = 0xfef00, LENGTH = 0x00f20 48 STACK (w) : ORIGIN = 0xffe20, LENGTH = 0x00002 49 SADDR (w) : ORIGIN = 0xffe20, LENGTH = 0x000a0 50} 51 52SECTIONS 53{ 54 .vec : 55 { 56 *(.vec) 57 } > VEC 58 .ivec : 59 { 60 *(.ivec) 61 } > IVEC 62 .opt : 63 { 64 *(.opt) 65 } > OPT 66 67 /* CubeSuite always starts at 0xd8. */ 68 .csstart : { 69 KEEP (*(.csstart)) 70 } > ROM 71 72 /* For code that must be in the first 64k, or could fill unused 73 space below .rodata. */ 74 .lowtext : { 75 *(.plt) 76 *(.lowtext) 77 } > ROM 78 79 .data : { 80 . = ALIGN(2); 81 PROVIDE (__datastart = .); 82 83 KEEP (*(.jcr)) 84 *(.data.rel.ro.local) *(.data.rel.ro*) 85 *(.dynamic) 86 87 *(.data D .data.* .gnu.linkonce.d.*) 88 KEEP (*(.gnu.linkonce.d.*personality*)) 89 SORT(CONSTRUCTORS) 90 *(.data1) 91 *(.got.plt) *(.got) 92 93 /* We want the small data sections together, so single-instruction offsets 94 can access them all, and initialized data all before uninitialized, so 95 we can shorten the on-disk segment size. */ 96 . = ALIGN(2); 97 *(.sdata .sdata.* .gnu.linkonce.s.* D_2 D_1) 98 99 . = ALIGN(2); 100 _edata = .; 101 PROVIDE (edata = .); 102 PROVIDE (__dataend = .); 103 } > RAM AT> ROM 104 105 /* Note that crt0 assumes this is a multiple of two; all the 106 start/stop symbols are also assumed word-aligned. */ 107 PROVIDE(__romdatastart = LOADADDR(.data)); 108 PROVIDE (__romdatacopysize = SIZEOF(.data)); 109 110 .bss : { 111 . = ALIGN(2); 112 PROVIDE (__bssstart = .); 113 *(.dynbss) 114 *(.sbss .sbss.*) 115 *(.bss B B_2 B_1 .bss.* .gnu.linkonce.b.*) 116 . = ALIGN(2); 117 *(COMMON) 118 . = ALIGN(2); 119 PROVIDE (__bssend = .); 120 _end = .; 121 PROVIDE (end = .); 122 } > RAM 123 PROVIDE (__bsssize = SIZEOF(.bss)); 124 125 /* The __stack_size value of 0x100 is just a guess, but since it is 126 PROVIDEd the user can override it on the command line. It has to be 127 set here, rather than inside the .stack section, as symbols defined 128 inside sections are only evaluated during the final phase of the link, 129 long after the ASSERT is checked. An ASSERT referencing a PROVIDED but 130 not yet evaluated symbol will automatically fail. 131 132 FIXME: It would be nice if this value could be automatically set via 133 gcc's -fstack-usage command line option somehow. */ 134 PROVIDE (__stack_size = 0x100); 135 136 .stack (ORIGIN (STACK)) : 137 { 138 PROVIDE (__stack = .); 139 *(.stack) 140 141 /* Linker section checking ignores empty sections like 142 this one so we have to have our own test here. */ 143 ASSERT ((__stack > (_end + __stack_size)), 144 "Error: Too much data - no room left for the stack"); 145 } 146 147 .saddr : { 148 . = ALIGN(2); 149 PROVIDE (__saddrstart = .); 150 *(.saddr) 151 . = ALIGN(2); 152 } >SADDR AT>ROM 153 PROVIDE(__romsaddrstart = LOADADDR(.saddr)); 154 PROVIDE (__romsaddrcopysize = SIZEOF(.saddr)); 155 156 .rodata (MAX(__romdatastart + __romdatacopysize, 0x2000)) : { 157 . = ALIGN(2); 158 *(.plt) 159 *(.rodata C C_2 C_1 .rodata.* .gnu.linkonce.r.*) 160 *(.rodata1) 161 *(.eh_frame_hdr) 162 KEEP (*(.eh_frame)) 163 KEEP (*(.gcc_except_table)) *(.gcc_except_table.*) 164 PROVIDE (__preinit_array_start = .); 165 KEEP (*(.preinit_array)) 166 PROVIDE (__preinit_array_end = .); 167 PROVIDE (__init_array_start = .); 168 KEEP (*(SORT(.init_array.*))) 169 KEEP (*(.init_array)) 170 PROVIDE (__init_array_end = .); 171 PROVIDE (__fini_array_start = .); 172 KEEP (*(.fini_array)) 173 KEEP (*(SORT(.fini_array.*))) 174 PROVIDE (__fini_array_end = .); 175 LONG(0); /* Sentinel. */ 176 177 /* gcc uses crtbegin.o to find the start of the constructors, so 178 we make sure it is first. Because this is a wildcard, it 179 doesn't matter if the user does not actually link against 180 crtbegin.o; the linker won't look for a file to match a 181 wildcard. The wildcard also means that it doesn't matter which 182 directory crtbegin.o is in. */ 183 KEEP (*crtbegin*.o(.ctors)) 184 185 /* We don't want to include the .ctor section from from the 186 crtend.o file until after the sorted ctors. The .ctor section 187 from the crtend file contains the end of ctors marker and it 188 must be last */ 189 KEEP (*(EXCLUDE_FILE (*crtend*.o ) .ctors)) 190 KEEP (*(SORT(.ctors.*))) 191 KEEP (*(.ctors)) 192 193 KEEP (*crtbegin*.o(.dtors)) 194 KEEP (*(EXCLUDE_FILE (*crtend*.o ) .dtors)) 195 KEEP (*(SORT(.dtors.*))) 196 KEEP (*(.dtors)) 197 } > ROM 198 199 .frodata : { 200 *(.frodata) 201 } > ROM 202 203 .text : 204 { 205 PROVIDE (_start = .); 206 *(.text P .stub .text.* .gnu.linkonce.t.*) 207 KEEP (*(.text.*personality*)) 208 /* .gnu.warning sections are handled specially by elf32.em. */ 209 *(.gnu.warning) 210 *(.interp .hash .dynsym .dynstr .gnu.version*) 211 PROVIDE (__etext = .); 212 PROVIDE (_etext = .); 213 PROVIDE (etext = .); 214 . = ALIGN(2); 215 KEEP (*(.init)) 216 KEEP (*(.fini)) 217 } > ROM 218 219 /* The rest are all not normally part of the runtime image. */ 220 221 /* The rest are all not normally part of the runtime image. */ 222 PROVIDE (__rl78_abs__ = 0); 223 224 /* Stabs debugging sections. */ 225 .stab 0 : { *(.stab) } 226 .stabstr 0 : { *(.stabstr) } 227 .stab.excl 0 : { *(.stab.excl) } 228 .stab.exclstr 0 : { *(.stab.exclstr) } 229 .stab.index 0 : { *(.stab.index) } 230 .stab.indexstr 0 : { *(.stab.indexstr) } 231 .comment 0 : { *(.comment) } 232 /* DWARF debug sections. 233 Symbols in the DWARF debugging sections are relative to the beginning 234 of the section so we begin them at 0. */ 235 /* DWARF 1 */ 236 .debug 0 : { *(.debug) } 237 .line 0 : { *(.line) } 238 /* GNU DWARF 1 extensions */ 239 .debug_srcinfo 0 : { *(.debug_srcinfo) } 240 .debug_sfnames 0 : { *(.debug_sfnames) } 241 /* DWARF 1.1 and DWARF 2 */ 242 .debug_aranges 0 : { *(.debug_aranges) } 243 .debug_pubnames 0 : { *(.debug_pubnames) } 244 /* DWARF 2 */ 245 .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } 246 .debug_abbrev 0 : { *(.debug_abbrev) } 247 .debug_line 0 : { *(.debug_line .debug_line.* .debug_line_end ) } 248 .debug_frame 0 : { *(.debug_frame) } 249 .debug_str 0 : { *(.debug_str) } 250 .debug_loc 0 : { *(.debug_loc) } 251 .debug_macinfo 0 : { *(.debug_macinfo) } 252 /* SGI/MIPS DWARF 2 extensions */ 253 .debug_weaknames 0 : { *(.debug_weaknames) } 254 .debug_funcnames 0 : { *(.debug_funcnames) } 255 .debug_typenames 0 : { *(.debug_typenames) } 256 .debug_varnames 0 : { *(.debug_varnames) } 257 /DISCARD/ : { *(.note.GNU-stack) } 258} 259