1# 2# Unusual variables checked by this code: 3# NOP - two byte opcode for no-op (defaults to 0) 4# INITIAL_READONLY_SECTIONS - at start of text segment 5# OTHER_READONLY_SECTIONS - other than .text .init .rodata ... 6# (e.g., .PARISC.milli) 7# OTHER_TEXT_SECTIONS - these get put in .text when relocating 8# OTHER_READWRITE_SECTIONS - other than .data .bss .ctors .sdata ... 9# (e.g., .PARISC.global) 10# OTHER_SECTIONS - at the end 11# EXECUTABLE_SYMBOLS - symbols that must be defined for an 12# executable (e.g., _DYNAMIC_LINK) 13# TEXT_START_SYMBOLS - symbols that appear at the start of the 14# .text section. 15# DATA_START_SYMBOLS - symbols that appear at the start of the 16# .data section. 17# OTHER_GOT_SYMBOLS - symbols defined just before .got. 18# OTHER_GOT_SECTIONS - sections just after .got and .sdata. 19# OTHER_BSS_SYMBOLS - symbols that appear at the start of the 20# .bss section besides __bss_start. 21# INPUT_FILES - INPUT command of files to always include 22# INIT_START, INIT_END - statements just before and just after 23# combination of .init sections. 24# FINI_START, FINI_END - statements just before and just after 25# combination of .fini sections. 26# 27# When adding sections, do note that the names of some sections are used 28# when specifying the start address of the next. 29# 30 31# Many sections come in three flavours. There is the 'real' section, 32# like ".data". Then there are the per-procedure or per-variable 33# sections, generated by -ffunction-sections and -fdata-sections in GCC, 34# and useful for --gc-sections, which for a variable "foo" might be 35# ".data.foo". Then there are the linkonce sections, for which the linker 36# eliminates duplicates, which are named like ".gnu.linkonce.d.foo". 37# The exact correspondences are: 38# 39# Section Linkonce section 40# .text .gnu.linkonce.t.foo 41# .rodata .gnu.linkonce.r.foo 42# .data .gnu.linkonce.d.foo 43# .bss .gnu.linkonce.b.foo 44# .sdata .gnu.linkonce.s.foo 45# .sbss .gnu.linkonce.sb.foo 46# .sdata2 .gnu.linkonce.s2.foo 47# .sbss2 .gnu.linkonce.sb2.foo 48# 49# Each of these can also have corresponding .rel.* and .rela.* sections. 50 51test -z "$ENTRY" && ENTRY=_start 52test -z "${BIG_OUTPUT_FORMAT}" && BIG_OUTPUT_FORMAT=${OUTPUT_FORMAT} 53test -z "${LITTLE_OUTPUT_FORMAT}" && LITTLE_OUTPUT_FORMAT=${OUTPUT_FORMAT} 54if [ -z "$MACHINE" ]; then OUTPUT_ARCH=${ARCH}; else OUTPUT_ARCH=${ARCH}:${MACHINE}; fi 55test -z "${ELFSIZE}" && ELFSIZE=32 56test -z "${ALIGNMENT}" && ALIGNMENT="${ELFSIZE} / 8" 57CTOR=".ctors ${CONSTRUCTING-0} : 58 { 59 ${CONSTRUCTING+${CTOR_START}} 60 /* gcc uses crtbegin.o to find the start of 61 the constructors, so we make sure it is 62 first. Because this is a wildcard, it 63 doesn't matter if the user does not 64 actually link against crtbegin.o; the 65 linker won't look for a file to match a 66 wildcard. The wildcard also means that it 67 doesn't matter which directory crtbegin.o 68 is in. */ 69 70 KEEP (*crtbegin*.o(.ctors)) 71 72 /* We don't want to include the .ctor section from 73 the crtend.o file until after the sorted ctors. 74 The .ctor section from the crtend file contains the 75 end of ctors marker and it must be last */ 76 77 KEEP (*(EXCLUDE_FILE (*crtend*.o $OTHER_EXCLUDE_FILES) .ctors)) 78 KEEP (*(SORT(.ctors.*))) 79 KEEP (*(.ctors)) 80 ${CONSTRUCTING+${CTOR_END}} 81 } > ROM" 82 83DTOR=" .dtors ${CONSTRUCTING-0} : 84 { 85 ${CONSTRUCTING+${DTOR_START}} 86 KEEP (*crtbegin*.o(.dtors)) 87 KEEP (*(EXCLUDE_FILE (*crtend*.o $OTHER_EXCLUDE_FILES) .dtors)) 88 KEEP (*(SORT(.dtors.*))) 89 KEEP (*(.dtors)) 90 ${CONSTRUCTING+${DTOR_END}} 91 } > ROM" 92 93cat <<EOF 94OUTPUT_FORMAT("${OUTPUT_FORMAT}", "${BIG_OUTPUT_FORMAT}", 95 "${LITTLE_OUTPUT_FORMAT}") 96OUTPUT_ARCH(${OUTPUT_ARCH}) 97ENTRY(${ENTRY}) 98 99${RELOCATING+${LIB_SEARCH_DIRS}} 100${RELOCATING+${EXECUTABLE_SYMBOLS}} 101${RELOCATING+${INPUT_FILES}} 102${RELOCATING- /* For some reason, the Solaris linker makes bad executables 103 if gld -r is used and the intermediate file has sections starting 104 at non-zero addresses. Could be a Solaris ld bug, could be a GNU ld 105 bug. But for now assigning the zero vmas works. */} 106 107/* There are two memory regions we care about, one from 0 through 0x7F00 108 that is RAM and one from 0x8000 up which is ROM. */ 109MEMORY 110{ 111 RAM (w) : ORIGIN = 0, LENGTH = 0x7F00 112 ROM (!w) : ORIGIN = 0x8000, LENGTH = 0xFF8000 113} 114 115SECTIONS 116{ 117 .data ${RELOCATING-0} : 118 { 119 ${RELOCATING+__rdata = .;} 120 ${RELOCATING+__data = .;} 121 ${RELOCATING+${DATA_START_SYMBOLS}} 122 *(.data) 123 ${RELOCATING+*(.data.*)} 124 ${RELOCATING+*(.gnu.linkonce.d.*)} 125 ${CONSTRUCTING+SORT(CONSTRUCTORS)} 126 } > RAM 127 ${RELOCATING+${OTHER_READWRITE_SECTIONS}} 128 ${RELOCATING+${OTHER_GOT_SYMBOLS}} 129 ${RELOCATING+${OTHER_GOT_SECTIONS}} 130 ${RELOCATING+_edata = .;} 131 ${RELOCATING+PROVIDE (edata = .);} 132 ${RELOCATING+__bss_start = .;} 133 ${RELOCATING+${OTHER_BSS_SYMBOLS}} 134 .bss ${RELOCATING-0} : 135 { 136 *(.dynbss) 137 *(.bss) 138 ${RELOCATING+*(.bss.*)} 139 ${RELOCATING+*(.gnu.linkonce.b.*)} 140 *(COMMON) 141 /* Align here to ensure that the .bss section occupies space up to 142 _end. Align after .bss to ensure correct alignment even if the 143 .bss section disappears because there are no input sections. */ 144 ${RELOCATING+. = ALIGN(${ALIGNMENT});} 145 } > RAM 146 ${RELOCATING+${OTHER_BSS_END_SYMBOLS}} 147 ${RELOCATING+. = ALIGN(${ALIGNMENT});} 148 ${RELOCATING+${OTHER_END_SYMBOLS}} 149 ${RELOCATING+_end = .;} 150 ${RELOCATING+__stack = .;} 151 ${RELOCATING+PROVIDE (end = .);} 152 153 /* Read-only sections in ROM. */ 154 .int_vec ${RELOCATING-0} : { *(.int_vec) } ${RELOCATING+> ROM} 155 156 .rodata ${RELOCATING-0} : { *(.rodata) ${RELOCATING+*(.rodata.*)} ${RELOCATING+*(.gnu.linkonce.r.*)} } ${RELOCATING+> ROM} 157 ${RELOCATING+${CTOR}} 158 ${RELOCATING+${DTOR}} 159 .jcr : { KEEP (*(.jcr)) } ${RELOCATING+> ROM} 160 .eh_frame : { KEEP (*(.eh_frame)) } ${RELOCATING+> ROM} 161 .gcc_except_table : { *(.gcc_except_table) } ${RELOCATING+> ROM} 162 .plt : { *(.plt) } ${RELOCATING+> ROM} 163 164 .text ${RELOCATING-0} : 165 { 166 ${RELOCATING+${TEXT_START_SYMBOLS}} 167 *(.text) 168 ${RELOCATING+*(.text.*)} 169 *(.stub) 170 /* .gnu.warning sections are handled specially by elf32.em. */ 171 *(.gnu.warning) 172 ${RELOCATING+*(.gnu.linkonce.t.*)} 173 ${RELOCATING+${OTHER_TEXT_SECTIONS}} 174 } ${RELOCATING+> ROM =${NOP-0}} 175 .init ${RELOCATING-0} : 176 { 177 ${RELOCATING+${INIT_START}} 178 KEEP (*(.init)) 179 ${RELOCATING+${INIT_END}} 180 } ${RELOCATING+> ROM =${NOP-0}} 181 .fini ${RELOCATING-0} : 182 { 183 ${RELOCATING+${FINI_START}} 184 KEEP (*(.fini)) 185 ${RELOCATING+${FINI_END}} 186 } ${RELOCATING+> ROM =${NOP-0}} 187 ${RELOCATING+PROVIDE (__etext = .);} 188 ${RELOCATING+PROVIDE (_etext = .);} 189 ${RELOCATING+PROVIDE (etext = .);} 190 ${RELOCATING+${OTHER_READONLY_SECTIONS}} 191 192 193 /* Stabs debugging sections. */ 194 .stab 0 : { *(.stab) } 195 .stabstr 0 : { *(.stabstr) } 196 .stab.excl 0 : { *(.stab.excl) } 197 .stab.exclstr 0 : { *(.stab.exclstr) } 198 .stab.index 0 : { *(.stab.index) } 199 .stab.indexstr 0 : { *(.stab.indexstr) } 200 201 .comment 0 : { *(.comment) } 202 203 /* DWARF debug sections. 204 Symbols in the DWARF debugging sections are relative to the beginning 205 of the section so we begin them at 0. */ 206 207 /* DWARF 1 */ 208 .debug 0 : { *(.debug) } 209 .line 0 : { *(.line) } 210 211 /* GNU DWARF 1 extensions */ 212 .debug_srcinfo 0 : { *(.debug_srcinfo) } 213 .debug_sfnames 0 : { *(.debug_sfnames) } 214 215 /* DWARF 1.1 and DWARF 2 */ 216 .debug_aranges 0 : { *(.debug_aranges) } 217 .debug_pubnames 0 : { *(.debug_pubnames) } 218 219 /* DWARF 2 */ 220 .debug_info 0 : { *(.debug_info) *(.gnu.linkonce.wi.*) } 221 .debug_abbrev 0 : { *(.debug_abbrev) } 222 .debug_line 0 : { *(.debug_line) } 223 .debug_frame 0 : { *(.debug_frame) } 224 .debug_str 0 : { *(.debug_str) } 225 .debug_loc 0 : { *(.debug_loc) } 226 .debug_macinfo 0 : { *(.debug_macinfo) } 227 228 /* SGI/MIPS DWARF 2 extensions */ 229 .debug_weaknames 0 : { *(.debug_weaknames) } 230 .debug_funcnames 0 : { *(.debug_funcnames) } 231 .debug_typenames 0 : { *(.debug_typenames) } 232 .debug_varnames 0 : { *(.debug_varnames) } 233 234 ${RELOCATING+${OTHER_RELOCATING_SECTIONS}} 235 236 /* These must appear regardless of ${RELOCATING}. */ 237 ${OTHER_SECTIONS} 238} 239EOF 240