1232809Sjmallett/***********************license start*************** 2232809Sjmallett * Copyright (c) 2003-2010 Cavium Inc. (support@cavium.com). All rights 3232809Sjmallett * reserved. 4232809Sjmallett * 5232809Sjmallett * 6232809Sjmallett * Redistribution and use in source and binary forms, with or without 7232809Sjmallett * modification, are permitted provided that the following conditions are 8232809Sjmallett * met: 9232809Sjmallett * 10232809Sjmallett * * Redistributions of source code must retain the above copyright 11232809Sjmallett * notice, this list of conditions and the following disclaimer. 12232809Sjmallett * 13232809Sjmallett * * Redistributions in binary form must reproduce the above 14232809Sjmallett * copyright notice, this list of conditions and the following 15232809Sjmallett * disclaimer in the documentation and/or other materials provided 16232809Sjmallett * with the distribution. 17232809Sjmallett 18232809Sjmallett * * Neither the name of Cavium Inc. nor the names of 19232809Sjmallett * its contributors may be used to endorse or promote products 20232809Sjmallett * derived from this software without specific prior written 21232809Sjmallett * permission. 22232809Sjmallett 23232809Sjmallett * This Software, including technical data, may be subject to U.S. export control 24232809Sjmallett * laws, including the U.S. Export Administration Act and its associated 25232809Sjmallett * regulations, and may be subject to export or import regulations in other 26232809Sjmallett * countries. 27232809Sjmallett 28232809Sjmallett * TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS" 29232809Sjmallett * AND WITH ALL FAULTS AND CAVIUM INC. MAKES NO PROMISES, REPRESENTATIONS OR 30232809Sjmallett * WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH RESPECT TO 31232809Sjmallett * THE SOFTWARE, INCLUDING ITS CONDITION, ITS CONFORMITY TO ANY REPRESENTATION OR 32232809Sjmallett * DESCRIPTION, OR THE EXISTENCE OF ANY LATENT OR PATENT DEFECTS, AND CAVIUM 33232809Sjmallett * SPECIFICALLY DISCLAIMS ALL IMPLIED (IF ANY) WARRANTIES OF TITLE, 34232809Sjmallett * MERCHANTABILITY, NONINFRINGEMENT, FITNESS FOR A PARTICULAR PURPOSE, LACK OF 35232809Sjmallett * VIRUSES, ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, QUIET POSSESSION OR 36232809Sjmallett * CORRESPONDENCE TO DESCRIPTION. THE ENTIRE RISK ARISING OUT OF USE OR 37232809Sjmallett * PERFORMANCE OF THE SOFTWARE LIES WITH YOU. 38232809Sjmallett ***********************license end**************************************/ 39232809Sjmallett 40232809Sjmallett 41232809Sjmallett 42232809Sjmallett 43232809Sjmallett 44232809Sjmallett 45232809Sjmallett/* 46232809Sjmallett * This was created from a template supplied by GNU binutils. 47232809Sjmallett * Copyright (C) 2005 Cavium Inc. 48232809Sjmallett */ 49232809Sjmallett 50232809Sjmallett/** 51232809Sjmallett * @file 52232809Sjmallett * This linker script for use in building simple executive application to run 53232809Sjmallett * under Linux in userspace. The important difference from a standard Linux 54232809Sjmallett * binary is the addition of the ".cvmx_shared" memory section. This script 55232809Sjmallett * adds two symbols __cvmx_shared_start and __cvmx_shared_end before and after 56232809Sjmallett * the CVMX_SHARED data. These are used by cvmx-app-init-linux.c to create a 57232809Sjmallett * shared region across all application processes. 58232809Sjmallett * 59232809Sjmallett * The original template for this files was: 60232809Sjmallett * ${OCTEON_ROOT}/tools/mips64-octeon-linux-gnu/lib/ldscripts/elf32btsmipn32.x 61232809Sjmallett */ 62232809SjmallettOUTPUT_FORMAT("elf32-ntradbigmips", "elf32-ntradbigmips", 63232809Sjmallett "elf32-ntradlittlemips") 64232809SjmallettOUTPUT_ARCH(mips) 65232809SjmallettENTRY(__start) 66232809SjmallettSEARCH_DIR("${OCTEON_ROOT}/tools/mips64-octeon-linux-gnu/lib"); 67232809SjmallettSECTIONS 68232809Sjmallett{ 69232809Sjmallett /* Read-only sections, merged into text segment: */ 70232809Sjmallett PROVIDE (__executable_start = 0x10000000); . = 0x10000000 + SIZEOF_HEADERS; 71232809Sjmallett .interp : { *(.interp) } 72232809Sjmallett .reginfo : { *(.reginfo) } 73232809Sjmallett .note.gnu.build-id : { *(.note.gnu.build-id) } 74232809Sjmallett .dynamic : { *(.dynamic) } 75232809Sjmallett .hash : { *(.hash) } 76232809Sjmallett .gnu.hash : { *(.gnu.hash) } 77232809Sjmallett .dynsym : { *(.dynsym) } 78232809Sjmallett .dynstr : { *(.dynstr) } 79232809Sjmallett .gnu.version : { *(.gnu.version) } 80232809Sjmallett .gnu.version_d : { *(.gnu.version_d) } 81232809Sjmallett .gnu.version_r : { *(.gnu.version_r) } 82232809Sjmallett .rel.init : { *(.rel.init) } 83232809Sjmallett .rela.init : { *(.rela.init) } 84232809Sjmallett .rel.text : { *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*) } 85232809Sjmallett .rela.text : { *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*) } 86232809Sjmallett .rel.fini : { *(.rel.fini) } 87232809Sjmallett .rela.fini : { *(.rela.fini) } 88232809Sjmallett .rel.rodata : { *(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*) } 89232809Sjmallett .rela.rodata : { *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*) } 90232809Sjmallett .rel.data.rel.ro : { *(.rel.data.rel.ro* .rel.gnu.linkonce.d.rel.ro.*) } 91232809Sjmallett .rela.data.rel.ro : { *(.rela.data.rel.ro* .rela.gnu.linkonce.d.rel.ro.*) } 92232809Sjmallett .rel.data : { *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*) } 93232809Sjmallett .rela.data : { *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*) } 94232809Sjmallett .rel.tdata : { *(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*) } 95232809Sjmallett .rela.tdata : { *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*) } 96232809Sjmallett .rel.tbss : { *(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*) } 97232809Sjmallett .rela.tbss : { *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*) } 98232809Sjmallett .rel.ctors : { *(.rel.ctors) } 99232809Sjmallett .rela.ctors : { *(.rela.ctors) } 100232809Sjmallett .rel.dtors : { *(.rel.dtors) } 101232809Sjmallett .rela.dtors : { *(.rela.dtors) } 102232809Sjmallett .rel.got : { *(.rel.got) } 103232809Sjmallett .rela.got : { *(.rela.got) } 104232809Sjmallett .rel.dyn : { *(.rel.dyn) } 105232809Sjmallett .rel.sdata : { *(.rel.sdata .rel.sdata.* .rel.gnu.linkonce.s.*) } 106232809Sjmallett .rela.sdata : { *(.rela.sdata .rela.sdata.* .rela.gnu.linkonce.s.*) } 107232809Sjmallett .rel.sbss : { *(.rel.sbss .rel.sbss.* .rel.gnu.linkonce.sb.*) } 108232809Sjmallett .rela.sbss : { *(.rela.sbss .rela.sbss.* .rela.gnu.linkonce.sb.*) } 109232809Sjmallett .rel.sdata2 : { *(.rel.sdata2 .rel.sdata2.* .rel.gnu.linkonce.s2.*) } 110232809Sjmallett .rela.sdata2 : { *(.rela.sdata2 .rela.sdata2.* .rela.gnu.linkonce.s2.*) } 111232809Sjmallett .rel.sbss2 : { *(.rel.sbss2 .rel.sbss2.* .rel.gnu.linkonce.sb2.*) } 112232809Sjmallett .rela.sbss2 : { *(.rela.sbss2 .rela.sbss2.* .rela.gnu.linkonce.sb2.*) } 113232809Sjmallett .rel.bss : { *(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*) } 114232809Sjmallett .rela.bss : { *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*) } 115232809Sjmallett .rel.plt : { *(.rel.plt) } 116232809Sjmallett .rela.plt : { *(.rela.plt) } 117232809Sjmallett .init : 118232809Sjmallett { 119232809Sjmallett KEEP (*(.init)) 120232809Sjmallett } =0 121232809Sjmallett .plt : { *(.plt) } 122232809Sjmallett .text : 123232809Sjmallett { 124232809Sjmallett _ftext = . ; 125232809Sjmallett *(.text .stub .text.* .gnu.linkonce.t.*) 126232809Sjmallett /* .gnu.warning sections are handled specially by elf32.em. */ 127232809Sjmallett *(.gnu.warning) 128232809Sjmallett *(.mips16.fn.*) *(.mips16.call.*) 129232809Sjmallett } =0 130232809Sjmallett .fini : 131232809Sjmallett { 132232809Sjmallett KEEP (*(.fini)) 133232809Sjmallett } =0 134232809Sjmallett PROVIDE (__etext = .); 135232809Sjmallett PROVIDE (_etext = .); 136232809Sjmallett PROVIDE (etext = .); 137232809Sjmallett .rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) } 138232809Sjmallett .rodata1 : { *(.rodata1) } 139232809Sjmallett .sdata2 : 140232809Sjmallett { 141232809Sjmallett *(.sdata2 .sdata2.* .gnu.linkonce.s2.*) 142232809Sjmallett } 143232809Sjmallett .sbss2 : { *(.sbss2 .sbss2.* .gnu.linkonce.sb2.*) } 144232809Sjmallett .eh_frame_hdr : { *(.eh_frame_hdr) } 145232809Sjmallett .eh_frame : ONLY_IF_RO { KEEP (*(.eh_frame)) } 146232809Sjmallett .gcc_except_table : ONLY_IF_RO { *(.gcc_except_table .gcc_except_table.*) } 147232809Sjmallett /* Adjust the address for the data segment. We want to adjust up to 148232809Sjmallett the same address within the page on the next page up. */ 149232809Sjmallett . = ALIGN (CONSTANT (MAXPAGESIZE)) - ((CONSTANT (MAXPAGESIZE) - .) & (CONSTANT (MAXPAGESIZE) - 1)); . = DATA_SEGMENT_ALIGN (CONSTANT (MAXPAGESIZE), CONSTANT (COMMONPAGESIZE)); 150232809Sjmallett /* Exception handling */ 151232809Sjmallett .eh_frame : ONLY_IF_RW { KEEP (*(.eh_frame)) } 152232809Sjmallett .gcc_except_table : ONLY_IF_RW { *(.gcc_except_table .gcc_except_table.*) } 153232809Sjmallett /* Thread Local Storage sections */ 154232809Sjmallett .tdata : { *(.tdata .tdata.* .gnu.linkonce.td.*) } 155232809Sjmallett .tbss : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) } 156232809Sjmallett .preinit_array : 157232809Sjmallett { 158232809Sjmallett PROVIDE_HIDDEN (__preinit_array_start = .); 159232809Sjmallett KEEP (*(.preinit_array)) 160232809Sjmallett PROVIDE_HIDDEN (__preinit_array_end = .); 161232809Sjmallett } 162232809Sjmallett .init_array : 163232809Sjmallett { 164232809Sjmallett PROVIDE_HIDDEN (__init_array_start = .); 165232809Sjmallett KEEP (*(SORT(.init_array.*))) 166232809Sjmallett KEEP (*(.init_array)) 167232809Sjmallett PROVIDE_HIDDEN (__init_array_end = .); 168232809Sjmallett } 169232809Sjmallett .fini_array : 170232809Sjmallett { 171232809Sjmallett PROVIDE_HIDDEN (__fini_array_start = .); 172232809Sjmallett KEEP (*(.fini_array)) 173232809Sjmallett KEEP (*(SORT(.fini_array.*))) 174232809Sjmallett PROVIDE_HIDDEN (__fini_array_end = .); 175232809Sjmallett } 176232809Sjmallett .ctors : 177232809Sjmallett { 178232809Sjmallett /* gcc uses crtbegin.o to find the start of 179232809Sjmallett the constructors, so we make sure it is 180232809Sjmallett first. Because this is a wildcard, it 181232809Sjmallett doesn't matter if the user does not 182232809Sjmallett actually link against crtbegin.o; the 183232809Sjmallett linker won't look for a file to match a 184232809Sjmallett wildcard. The wildcard also means that it 185232809Sjmallett doesn't matter which directory crtbegin.o 186232809Sjmallett is in. */ 187232809Sjmallett KEEP (*crtbegin.o(.ctors)) 188232809Sjmallett KEEP (*crtbegin?.o(.ctors)) 189232809Sjmallett /* We don't want to include the .ctor section from 190232809Sjmallett the crtend.o file until after the sorted ctors. 191232809Sjmallett The .ctor section from the crtend file contains the 192232809Sjmallett end of ctors marker and it must be last */ 193232809Sjmallett KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) 194232809Sjmallett KEEP (*(SORT(.ctors.*))) 195232809Sjmallett KEEP (*(.ctors)) 196232809Sjmallett } 197232809Sjmallett .dtors : 198232809Sjmallett { 199232809Sjmallett KEEP (*crtbegin.o(.dtors)) 200232809Sjmallett KEEP (*crtbegin?.o(.dtors)) 201232809Sjmallett KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) 202232809Sjmallett KEEP (*(SORT(.dtors.*))) 203232809Sjmallett KEEP (*(.dtors)) 204232809Sjmallett } 205232809Sjmallett .jcr : { KEEP (*(.jcr)) } 206232809Sjmallett .data.rel.ro : { *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro* .gnu.linkonce.d.rel.ro.*) } 207232809Sjmallett . = DATA_SEGMENT_RELRO_END (0, .); 208232809Sjmallett .data : 209232809Sjmallett { 210232809Sjmallett _fdata = . ; 211232809Sjmallett *(.data .data.* .gnu.linkonce.d.*) 212232809Sjmallett SORT(CONSTRUCTORS) 213232809Sjmallett } 214232809Sjmallett .data1 : { *(.data1) } 215232809Sjmallett .got.plt : { *(.got.plt) } 216232809Sjmallett . = .; 217232809Sjmallett _gp = ALIGN(16) + 0x7ff0; 218232809Sjmallett .got : { *(.got) } 219232809Sjmallett /* We want the small data sections together, so single-instruction offsets 220232809Sjmallett can access them all, and initialized data all before uninitialized, so 221232809Sjmallett we can shorten the on-disk segment size. */ 222232809Sjmallett .sdata : 223232809Sjmallett { 224232809Sjmallett *(.sdata .sdata.* .gnu.linkonce.s.*) 225232809Sjmallett } 226232809Sjmallett .lit8 : { *(.lit8) } 227232809Sjmallett .lit4 : { *(.lit4) } 228232809Sjmallett .srdata : { *(.srdata) } 229232809Sjmallett 230232809Sjmallett . = ALIGN (0x10000); 231232809Sjmallett __cvmx_shared_start = .; 232232809Sjmallett .cvmx_shared : {*(.cvmx_shared .cvmx_shared.linkonce.*)} 233232809Sjmallett .cvmx_shared_bss : { *(.cvmx_shared_bss .cvmx_shared_bss.linkonce.*) } 234232809Sjmallett . = ALIGN (0x10000); 235232809Sjmallett __cvmx_shared_end = .; 236232809Sjmallett 237232809Sjmallett _edata = .; PROVIDE (edata = .); 238232809Sjmallett __bss_start = .; 239232809Sjmallett _fbss = .; 240232809Sjmallett .sbss : 241232809Sjmallett { 242232809Sjmallett PROVIDE (__sbss_start = .); 243232809Sjmallett PROVIDE (___sbss_start = .); 244232809Sjmallett *(.dynsbss) 245232809Sjmallett *(.sbss .sbss.* .gnu.linkonce.sb.*) 246232809Sjmallett *(.scommon) 247232809Sjmallett PROVIDE (__sbss_end = .); 248232809Sjmallett PROVIDE (___sbss_end = .); 249232809Sjmallett } 250232809Sjmallett .bss : 251232809Sjmallett { 252232809Sjmallett *(.dynbss) 253232809Sjmallett *(.bss .bss.* .gnu.linkonce.b.*) 254232809Sjmallett *(COMMON) 255232809Sjmallett /* Align here to ensure that the .bss section occupies space up to 256232809Sjmallett _end. Align after .bss to ensure correct alignment even if the 257232809Sjmallett .bss section disappears because there are no input sections. 258232809Sjmallett FIXME: Why do we need it? When there is no .bss section, we don't 259232809Sjmallett pad the .data section. */ 260232809Sjmallett . = ALIGN(. != 0 ? 32 / 8 : 1); 261232809Sjmallett } 262232809Sjmallett . = ALIGN(32 / 8); 263232809Sjmallett . = ALIGN(32M); /* RBF added alignment of data */ 264232809Sjmallett .cvmx_shared : { *(.cvmx_shared) } 265232809Sjmallett _end = .; PROVIDE (end = .); 266232809Sjmallett . = DATA_SEGMENT_END (.); 267232809Sjmallett /* Stabs debugging sections. */ 268232809Sjmallett .stab 0 : { *(.stab) } 269232809Sjmallett .stabstr 0 : { *(.stabstr) } 270232809Sjmallett .stab.excl 0 : { *(.stab.excl) } 271232809Sjmallett .stab.exclstr 0 : { *(.stab.exclstr) } 272232809Sjmallett .stab.index 0 : { *(.stab.index) } 273232809Sjmallett .stab.indexstr 0 : { *(.stab.indexstr) } 274232809Sjmallett .comment 0 : { *(.comment) } 275232809Sjmallett /* DWARF debug sections. 276232809Sjmallett Symbols in the DWARF debugging sections are relative to the beginning 277232809Sjmallett of the section so we begin them at 0. */ 278232809Sjmallett /* DWARF 1 */ 279232809Sjmallett .debug 0 : { *(.debug) } 280232809Sjmallett .line 0 : { *(.line) } 281232809Sjmallett /* GNU DWARF 1 extensions */ 282232809Sjmallett .debug_srcinfo 0 : { *(.debug_srcinfo) } 283232809Sjmallett .debug_sfnames 0 : { *(.debug_sfnames) } 284232809Sjmallett /* DWARF 1.1 and DWARF 2 */ 285232809Sjmallett .debug_aranges 0 : { *(.debug_aranges) } 286232809Sjmallett .debug_pubnames 0 : { *(.debug_pubnames) } 287232809Sjmallett /* DWARF 2 */ 288232809Sjmallett .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } 289232809Sjmallett .debug_abbrev 0 : { *(.debug_abbrev) } 290232809Sjmallett .debug_line 0 : { *(.debug_line) } 291232809Sjmallett .debug_frame 0 : { *(.debug_frame) } 292232809Sjmallett .debug_str 0 : { *(.debug_str) } 293232809Sjmallett .debug_loc 0 : { *(.debug_loc) } 294232809Sjmallett .debug_macinfo 0 : { *(.debug_macinfo) } 295232809Sjmallett /* SGI/MIPS DWARF 2 extensions */ 296232809Sjmallett .debug_weaknames 0 : { *(.debug_weaknames) } 297232809Sjmallett .debug_funcnames 0 : { *(.debug_funcnames) } 298232809Sjmallett .debug_typenames 0 : { *(.debug_typenames) } 299232809Sjmallett .debug_varnames 0 : { *(.debug_varnames) } 300232809Sjmallett /* DWARF 3 */ 301232809Sjmallett .debug_pubtypes 0 : { *(.debug_pubtypes) } 302232809Sjmallett .debug_ranges 0 : { *(.debug_ranges) } 303232809Sjmallett .gnu.attributes 0 : { KEEP (*(.gnu.attributes)) } 304232809Sjmallett .gptab.sdata : { *(.gptab.data) *(.gptab.sdata) } 305232809Sjmallett .gptab.sbss : { *(.gptab.bss) *(.gptab.sbss) } 306232809Sjmallett /DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) } 307232809Sjmallett} 308